в общем, вроде так.
Где-то в цикле формируй IP-адреса (например от 192.165.32.1 до 192.165.32.254) и стартуй функцию с этой строкой в качестве параметра.
У меня там OutSrt переменная (для програмных нужд), если она не нужна, то удали ее.
Этот код работает (тест Windows95/98/Me), но нет потоков, может подвисать 1-2 секунды, в общем кривоват, так что далее улучшай сам.
function PingHost(HostName: String): String;
var
hIP : THandle;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
pHostEn : PHostEnt;
wVersionRequested : WORD;
lwsaData : WSAData;
error : DWORD;
destAddress : In_Addr;
OutStr: string;
begin
// Создаем handle
hIP := IcmpCreateFile();
GetMem(pIpe,sizeof(icmp_echo_reply)+sizeof(pingBuffer));
pIpe.Data := @pingBuffer;
pIpe.DataSize := sizeof(pingBuffer);
wVersionRequested := MakeWord(1,1);
OutStr := '';
error := WSAStartup(wVersionRequested,lwsaData);
if (error <> 0)
then begin
OutStr := OutStr + 'Нет сетевых сервисов (Error code: '+IntToStr(error)+')';
if TypeWork = 1
then Result := OutStr;
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
exit;
end;
OutStr := 'Pinging '+HostName+' ';
OutStr := CatString(OutStr, 1, 22);
pHostEn := gethostbyname(PChar(HostName));
error := GetLastError();
if (error <> 0) // Ошибка
then begin
OutStr := OutStr + ' -> ошибка получения IP-адреса';
if TypeWork = 1
then Result := OutStr;
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
exit;
end;
destAddress := PInAddr(pHostEn^.h_addr_list^)^;
// Посылаем ping-пакет
IcmpSendEcho(hIP, destAddress.S_addr, @pingBuffer, sizeof(pingBuffer), Nil, pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer), 500);
error := GetLastError();
if (error <> 0) // Ошибка
then begin
OutStr := OutStr + ' -> ping false';
if TypeWork = 1
then Result := OutStr;
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
exit;
end;
// Смотрим некоторые из вернувшихся данных
OutStr := OutStr + ' -> reply from '+
IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(HiWord(pIpe^.Address)))+
' (reply time: '+IntToStr(pIpe.RTTime)+' ms)';
Result := IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(HiWord(pIpe^.Address)));
if TypeWork = 1
then Result := OutStr;
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
end;