Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 00:14   #1
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию Подключение к PPoE (ras api)

Написал свой диалер для подключения интернета через PPoE. В коде использую такую функцию:
Код:
function DialProvider(connection: string): Boolean;
var
  pars: TRasDialParams;
  r: integer;
  C                   : Array[0..100] of Char;
begin
  hRas := 0;
  strpcopy(pars.szEntryName, connection); // имя учетной записи
  pars.szPhoneNumber := ''; // номеp телефона - по умолчанию
  pars.szcallbacknumber := ''; // callback нам не нужен
  strpcopy(pars.szPassWord, Form1.lbledt2.Text);
  pars.szDomain := '';   // аналогично с домейном
  pars.dwSize := Sizeof(TRasDialParams); // вычисляем pазмеp записи
        R:=RasDial(Nil, Nil, pars, 0, @RasCallback, hRAS);
        if r <> 0 then
      // если что-то неполучилось, то
          Begin
             RasGetErrorString(R,C,100);
             MessageBox(0,C,'Ошибка!',MB_OK);
             rasHangUp(hRas); // сбpасываем соединение
             result := false; // ф-ция тепеpь веpнет false
             Exit;
          end
        else
        result := true; // а если все ок - то true.

end;
Обнаружился косячок. Если локальная сеть отключена или просто не работает, эта функция пытается дозвониться и открывает порт/соединение. Но после этого оно оказывается как бы в подвешенном состоянии со статусом "Отключение". В центре управления сетями его нельзя отключить или просмотреть состояние-пункты меню не активны (см. скрин). При попытке удаления подключения система ругается, что оно активно. Моя прога сообщает, что оно подключено. И лечится сей баг только ребутом системы. Как побороть?


П.С. Мне кажется проблема в том, что код
Код:
rasHangUp(hRas); // сбpасываем соединение
в случае ошибки при подключении ни разу не сбрасывает его.

П.С.2 Разобрался. Ошибка при таких условиях обрабатывается в функе GetStatusString. В ней и надо разрывать соединение. Косячок популярной статьи дельфийского королевства "RAS API для непродвинутых".

Последний раз редактировалось NaumOff; 11.05.2012 в 13:13. Причина: Еврика!
NaumOff вне форума Ответить с цитированием
Старый 23.09.2016, 12:36   #2
KAGATAN
 
Регистрация: 13.11.2008
Сообщений: 3
По умолчанию

Столкнулся с такой же проблемой зависания...
Опиши пожалуйста как поборол
KAGATAN вне форума Ответить с цитированием
Старый 23.09.2016, 17:30   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Например читать посты до конца:
Цитата:
П.С.2 Разобрался. Ошибка при таких условиях обрабатывается в функе GetStatusString. В ней и надо разрывать соединение.
Человек_Борща вне форума Ответить с цитированием
Старый 23.09.2016, 17:59   #4
KAGATAN
 
Регистрация: 13.11.2008
Сообщений: 3
По умолчанию

дочитал конечно. просто не совсем понятно когда вызывается GetStatusString и что в нем было исправлено.

Оригинал статьи я так понимаю это
KAGATAN вне форума Ответить с цитированием
Старый 23.09.2016, 22:04   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
Function GetStatusString(State: TRasConnState; Error: Integer): String;
Var
C      : Array[0..100] of Char;
S      : String;
Begin
If Error<>0 then
Begin
    RasGetErrorString(Error, C, 100);
    Result:=C;
End
Else
Размер буфера под сообщение всегда 100, это ошибка.
Согласно MSDN, ANSI функция требует минимум 512 байт под буфер, UNICODE вообще минимум 1 кб.

По идее вам надо написать функцию GracefullCloseRASAndError(hRas: THandle): string; которая получит сообщение об ошибке и закроет подключение hRas.

Последний раз редактировалось Человек_Борща; 23.09.2016 в 22:06.
Человек_Борща вне форума Ответить с цитированием
Старый 23.09.2016, 22:16   #6
KAGATAN
 
Регистрация: 13.11.2008
Сообщений: 3
По умолчанию

насколько я понимаю в примере топик-стартера это и реализовано:
Код:
function DialProvider(connection: string): Boolean;
var
  pars: TRasDialParams;
  r: integer;
  C                   : Array[0..100] of Char;
begin
  hRas := 0;
  strpcopy(pars.szEntryName, connection); // имя учетной записи
  pars.szPhoneNumber := ''; // номеp телефона - по умолчанию
  pars.szcallbacknumber := ''; // callback нам не нужен
  strpcopy(pars.szPassWord, Form1.lbledt2.Text);
  pars.szDomain := '';   // аналогично с домейном
  pars.dwSize := Sizeof(TRasDialParams); // вычисляем pазмеp записи
        R:=RasDial(Nil, Nil, pars, 0, @RasCallback, hRAS);
        if r <> 0 then
      // если что-то неполучилось, то
          Begin
             RasGetErrorString(R,C,100);
             MessageBox(0,C,'Ошибка!',MB_OK);
             rasHangUp(hRas); // сбpасываем соединение
             result := false; // ф-ция тепеpь веpнет false
             Exit;
          end
        else
        result := true; // а если все ок - то true.

end;
вызывается "дозвон" RasDial и он возвращает № ошибки
Код:
  R:=RasDial(Nil, Nil, pars, 0, @RasCallback, hRAS);
в переменной R будет номер ошибки и если он не равен 0 (0= ошибки нет)
то происходит сброс текущего соединения hRas

Код:
 rasHangUp(hRas); // сбpасываем соединение
только в данной схеме почему то все равно зависание происходит... помогает только перезагрузка...

P.S. Может зависание происходит в самой RasDial и уже до сброса ничего не доходит ? Тогда по идее надо обработать "сброс дозвона" в колбеке RasCallback....
В процедуру передаются только статус и ошибка , в общем я запутался что то..
Код:
  { Эта процедура будет вызываться при любых изменениях в
    соединении: }

    procedure RasCallback(msg: integer; state: TRasConnState;
    error: Integer); stdcall;

Последний раз редактировалось KAGATAN; 23.09.2016 в 22:25.
KAGATAN вне форума Ответить с цитированием
Старый 23.09.2016, 23:28   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вы не умеете читать сообщения или невнимательны.
Цитата:
Размер буфера под сообщение всегда 100, это ошибка.
далее, вы не проверяете, что в hRAS вообще что-то попало.
и не проверяете что rasHangUp выполнилось успешно (включая GetLastError если нет)
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VK API Furyon JavaScript, Ajax 0 15.05.2011 17:44
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07
Подключение к БД FireBird через API [C++] anGeee SQL, базы данных 0 29.11.2009 21:53
Как подключить к проекту модуль ras.pas Михаил Юрьевич Общие вопросы Delphi 3 14.03.2009 15:45
RAS API. Проблемы с типом соединения MadMas Работа с сетью в Delphi 0 19.01.2009 09:48