![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ping [D6, Win95/98, WinXP]
Alpupil © (2004-05-04 21:05:00)Уважаемые мастера, я пишу программу по учету денег затраченных на Интернет и чтобы отследить соединение с Интернетом использую следующий код
function status:boolean;
var TpRasCon:array[0..255] of tRasConna;
lg:Longint;
lpcon: Longint;
RetVal ,i: Longint;
Tstatus : tRasConnStatusA;
begin lpcon:= 0;
FillChar(tprascon, SizeOf(Trasconna), 0);
TpRasCon[0].dwSize := sizeof(tRasConnA);
lg:= 255 * TpRasCon[0].dwSize;
RetVal:= RasEnumConnections(@TpRasCon[0], lg, lpcon);
Tstatus.dwSize:= sizeof(tRasConnStatusA);
RetVal:= RasGetConnectStatus(TpRasCon[0].hRasConn, Tstatus);
if lpcon>0 then ;
If Tstatus.RasConnState = $2000 Then result:= True
Else result:= false
end;
но это является косвенным признаком того что соединение с Инетом есть.
В форуме встречал такую тему как Ping (с примером), может ли этот способ помочь в определении соединения с Инетом, и где можно подробнее почитать на эту тему или может есть что-то попроще?
Спасибо всем кто потратит свое время.
-=Rezya=- (2004-05-04 23:03:00) [1]Если интересует Ping то пользуйся WinApi функциями. Здесь про это было если нет то смотри и изучай этот фрагмент кода бы здесь опубликован в сатье "Реализация ping с помощью ICMP API" Автора Владимира Артемова.
Ниже приведен базовый фрагмент кода, необходимый для однократного посыла эхо-запроса:
procedure TForm1.Button1Click(Sender: TObject);
var
hIP : THandle;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
pHostEn : PHostEnt;
wVersionRequested : WORD;
lwsaData : WSAData;
error : DWORD;
destAddress : In_Addr;
begin
// Создаем handle
hIP := IcmpCreateFile();
GetMem( pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer));
pIpe.Data := @pingBuffer;
pIpe.DataSize := sizeof(pingBuffer);
wVersionRequested := MakeWord(1,1);
error := WSAStartup(wVersionRequested,lwsaData);
if (error <> 0) then
begin
Memo1.SetTextBuf('Error in call to '+
'WSAStartup().');
Memo1.Lines.Add('Error code: '+IntToStr(error));
Exit;
end;
pHostEn := gethostbyname('delphi.mastak.com');
error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf('Error in call to'+
'gethostbyname().');
Memo1.Lines.Add('Error code: '+IntToStr(error));
Exit;
end;
destAddress := PInAddr(pHostEn^.h_addr_list^)^;
// Посылаем ping-пакет
Memo1.Lines.Add('Pinging ' +
pHostEn^.h_name+' ['+
inet_ntoa(destAddress)+'] '+
' with '+
IntToStr(sizeof(pingBuffer)) +
' bytes of data:');
IcmpSendEcho(hIP,
destAddress.S_addr,
@pingBuffer,
sizeof(pingBuffer),
Nil,
pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer),
5000);
error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf('Error in call to '+
'IcmpSendEcho()');
Memo1.Lines.Add('Error code: '+IntToStr(error));
Exit;
end;
// Смотрим некоторые из вернувшихся данных
Memo1.Lines.Add('Reply from '+
IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(HiWord(pIpe^.Address))));
Memo1.Lines.Add('Reply time: '+IntToStr(pIpe.RTTime)+' ms');
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
end;
Algol (2004-05-04 21:25:00) [2]Пинг осуществляется с помощью протокола ICMP, для него есть компонент IdIcmpClient. Про ICMP в яндексе неделями можно читать.