Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 в яндексе неделями можно читать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо