Форум: "Сети";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
ВнизЗнатоки RAS, откликнитесь! Найти похожие ветки
← →
star (2002-08-20 23:31) [0]Такая беда: через RASDial пытаюсь подключиться к нитернету, все нормально если все хорошо, а если, допустим, нет гудка в линии, то после обработки данной ошибки не могу снова попытаться сконнектиться - пишет ошибку, мол модем занят или что-то еще. Пробовал запускать RASHangUp после отсутствия гудка - не получается, указатель на соединение не убивается.
Как правильно очистить все данные о предыдущей неудачной попытке соединения и снова сконнектиться ?
← →
Ihor Osov'yak (2002-08-21 00:02) [1]Примерно так:
type
TConDescription = ( cdModem, { Local system uses a modem to connect to the Internet }
cdLan, { Local system uses a local area network to connect to the Internet }
cdUsesProxy, { Local system uses a proxy server to connect to the Internet }
cdModemBusy, { not used }
cdRasInstalled, { Local system has RAS installed }
cdOffline, { Local system is in offline mode }
cdConfigured { Local system has a valid connection to the Internet,
but it may or may not be currently connected }
);
TConDescriptions = set of TConDescription;
function inet_IsConnected(var ConDes: TConDescriptions; var sConName : string): boolean;
var
dwCTp : DWORD;
Buffer : array[0..MAX_PATH - 1] of char;
begin
dwCTp := 0;
Result := InternetGetConnectedStateEx(@dwCTp, Buffer, Sizeof(Buffer)-1, 0);
if Result then sConName := StrPas(Buffer);
ConDes := [];
if ( (dwCTp and INTERNET_CONNECTION_CONFIGURED ) > 0 )
then Include(ConDes, cdConfigured );
if ( (dwCTp and INTERNET_CONNECTION_LAN ) > 0 )
then Include(ConDes,cdLan);
if ( (dwCTp and INTERNET_CONNECTION_MODEM ) > 0 )
then Include(ConDes, cdModem );
if ( (dwCTp and INTERNET_CONNECTION_OFFLINE ) > 0 )
then Include(ConDes,cdOffline );
if ( (dwCTp and INTERNET_CONNECTION_PROXY ) > 0 )
then Include(ConDes,cdUsesProxy );
if ( (dwCTp and INTERNET_RAS_INSTALLED ) > 0 )
then Include(ConDes,cdRasInstalled);
end;
....
procedure TFormMain_YahooXXXX.StartDialUpProcess;
var
isInetConnect:boolean;
conectDescr:TConDescriptions;
sConName :string;
procedure FindDescrConnect;
var
enumArr:array[0..127] of TRasConnA;
Entry:integer;
cbBuf:integer;
i:integer;
s:string;
begin
FillChar(enumArr,sizeof(enumArr),0);
cbBuf := Sizeof(enumArr);
enumArr[0].dwSize:=Sizeof (enumArr[0]);;
Entry:=0;
RasEnumConnections(@enumArr,cbBuf,Entry);
for i:=0 to Entry - 1 do begin
s:=enumArr[i].szEntryName;
if s=sConName then begin
hRasConn:=enumArr[i].hrasconn;
Exit;
end;
end;
end;
begin
............
sConName := "";
isInetConnect := inet_IsConnected(conectDescr, sConName);
if isInetConnect then begin
LabelInfo.Caption := "Detected connect to inet. Connect name: "+sConName;
WrTm(0,LabelInfo.Caption);
if (cdModem in conectDescr) then Wr(0,"This connect is using a modem.");
end;
........
if isInetConnect then
if (cdModem in conectDescr) then
begin
if hRasConn=0 then FindDescrConnect; // в hRasConn
// содержится хендл коннекта от пред попытки дозвона,
// или нуль при первом прохождении процедуры
if hRasConn<>0 then begin
RasHangUp(hRasConn);
hRasConn := 0; isRasDone:=false;
_Pause1sec;
LabelInfo.Caption := "Disconnected ...";
WrTm(0,LabelInfo.Caption);
end;
end;
......
← →
star (2002-08-21 07:01) [2]Просто обнулить hRasConn?
Собственно я так делал, но меня остановило вот что: моей проге предстоит коннектиться десятки раз на дню без присмотра, не набежит там никакой ошибки (ну из-за какой-нибудь утечки мозгов, например)?
← →
Ihor Osov'yak (2002-08-21 08:15) [3]Неа.
Проверить, есть ли соединение, и если есть - отыскать его хендлер и сделать соотв. HangUp... Да, и что я вчера еще не сказал второпях - в callBack в случае ошибки также делать RasHangUp:
const
WUM_RASCallBack = WM_USER + 127;
type
TFormMain_YahooPSnd13 = class(TForm)
...
procedure WUMRASCallBack(var Msg:TMessage); message WUM_RASCallBack;
procedure TFormMain_YahooPSnd13.WUMRASCallBack(var Msg: TMessage);
var state:TRasConnState;
wError:Longint;
begin
wError := Msg.WParam; state:=TRasConnState(Msg.LParam);
LabelInfo.Caption := "RAS: "+StatusStrin_g(State);
WrTm(0,LabelInfo.Caption);
if wError<>0 then begin
LabelInfo.Caption := "RASError = "+IntToStr(wError);
WrTm(0,LabelInfo.Caption);
_Pause;
RasHangUP(hRasConn); hRasConn := 0; isRasDone:=false;
LabelInfo.Caption := " * HangUP * ";
WrTm(0,LabelInfo.Caption);
_Pause;
if sStageDial>=sdDialing4Entry then GotoNextAccountAfterNotDialing
else begin
inc(sStageDial);
if StageRun=srRun then TryDialingNextEntry
else exit;
end;
Exit;
end;
if State=RASCS_Connected then begin
SetGlobalOffline(false);
isRasDone := true;
//fAdd2.TryDo;
if StageRun=srRun then AfterSuccessedDialUpProcess
else Exit;
end;
if State=RASCS_Disconnected then begin
if StageRun=srRun then GotoNextAccountAfterNotDialing
else Exit;
end;
end;
procedure RASCallback(msg: Integer;state:TRasConnState;
wError:Longint); stdcall;
begin
PostMessage(FormMain_YahooPSnd13.Handle,WUM_RASCallBack,wError,ord(state));
end;
...
Ret:=RasDial(Nil,Nil,rdParams,0,@RASCallback,hRasConn);
← →
Star (2002-08-21 14:22) [4]Ну чтож, огромное спасибо, буду пробовать ...
← →
MBR (2002-08-22 01:07) [5]Я сталкивался с подобной проблемой - в MSDN по этому поводу сказано, что после HangUp нужно еще некоторое время подождать, пока соединение действительно завершится. В итоге это выглядит примерно так.
---
procedure MyRasHangUp(hRasCon : THRasConn);
var
RasConnStatus : TRasConnStatus;
begin
RasHangUp(hRasCon);
RasConnStatus.dwSize := SizeOf(RasConnStatus);
while RasGetConnectStatus(hRasCon, RasConnStatus) <> ERROR_INVALID_HANDLE do
Sleep(0);
end;
---
Вообще перепробовал кучу библиотек для работы и остановился на простом порте ras.h для дельфи:
http://www.kyler.net/pubs/DDJ9855.ZIP
---
MSDN:
An application should not call RasHangUp and then immediately exit. The connection state machine needs time to properly terminate. If the system prematurely terminates the state machine, the state machine may fail to properly close a port, leaving the port in an inconsistent state. A simple way to avoid this problem is to call Sleep(3000) after returning from RasHangUp; after that pause, the application can exit. A more responsive way to avoid the problem is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.
---
← →
star (2002-08-22 20:36) [6]Это я в MSDN-е видел и пробовал. Дело в том, что после RasHangUp и паузы делаю цикл с выходом по ERROR_INVALID_HANDLE, и при работе программа зацикливается в этом месте - hRasConn не уничтожается и RasGetConnectStatus не возвращает ERROR_INVALID_HANDLE. Потом ставил RasHangUp в этот цикл - тоже самое ...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c