Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Пропинговать

13 views
Skip to first unread message

Roman Krivtsov

unread,
Oct 9, 2005, 7:27:44 AM10/9/05
to
Привет, All!


Как пропинговать комп в локальной сети(можно и по очереди). Hужно, чтобы было
это реализовано полностью на делфи, т.е. я сам задал максимальное время
ожидания, и пакетов было отправлено не 4, а скока напишу.


До встречи, All!


... Hа более короткое письмо у меня не хватило времени

Igor Yegorkin

unread,
Nov 7, 2005, 5:17:46 PM11/7/05
to
Hi, Roman Krivtsov

> Как пропинговать комп в локальной сети(можно и по очереди). Hужно, чтобы было
> это реализовано полностью на делфи, т.е. я сам задал максимальное время
> ожидания, и пакетов было отправлено не 4, а скока напишу.

Разбирай на запчасти:

unit Ping;

interface

uses Windows, SysUtils, WinSock;

function IsIPHostUp(Address:string):Boolean;

implementation

const
WS_VERSION_REQD = $101;
ICMP_SUCCESS = 0;
ICMP_STATUS_BUFFER_TO_SMALL = 11001; // Buffer Too Small
ICMP_STATUS_DESTINATION_NET_UNREACH = 11002; // Destination Net
Unreachable
ICMP_STATUS_DESTINATION_HOST_UNREACH = 11003; // Destination Host
Unreachable
ICMP_STATUS_DESTINATION_PROTOCOL_UNREACH = 11004; // Destination Protocol
Unreachable
ICMP_STATUS_DESTINATION_PORT_UNREACH = 11005; // Destination Port
Unreachable
ICMP_STATUS_NO_RESOURCE = 11006; // No Resources
ICMP_STATUS_BAD_OPTION = 11007; // Bad Option
ICMP_STATUS_HARDWARE_ERROR = 11008; // Hardware Error
ICMP_STATUS_LARGE_PACKET = 11009; // Packet Too Big
ICMP_STATUS_REQUEST_TIMED_OUT = 11010; // Request Timed Out
ICMP_STATUS_BAD_REQUEST = 11011; // Bad Request
ICMP_STATUS_BAD_ROUTE = 11012; // Bad Route
ICMP_STATUS_TTL_EXPIRED_TRANSIT = 11013; // TimeToLive Expired
Transit
ICMP_STATUS_TTL_EXPIRED_REASSEMBLY = 11014; // TimeToLive Expired
Reassembly
ICMP_STATUS_PARAMETER = 11015; // Parameter Problem
ICMP_STATUS_SOURCE_QUENCH = 11016; // Source Quench
ICMP_STATUS_OPTION_TOO_BIG = 11017; // Option Too Big
ICMP_STATUS_BAD_DESTINATION = 11018; // Bad Destination
ICMP_STATUS_NEGOTIATING_IPSEC = 11032; // Negotiating IPSEC
ICMP_STATUS_GENERAL_FAILURE = 11050; // General Failure

type
IP_OPTION_INFORMATION = record
Ttl:Byte;
Tos:Byte;
Flags:Byte;
OptionsSize:Byte;
OptionsData:DWORD;
end;

ICMP_ECHO_REPLY = record
address:DWORD;
Status:DWORD;
RoundTripTime:DWORD;
DataSize:DWORD;
Reserved:Integer;
ptrData:DWORD;
Options:IP_OPTION_INFORMATION;
Data:string[250];
end;

function IcmpCreateFile:DWORD; stdcall; external 'icmp.dll' name 'IcmpCreateFile';
function IcmpCloseHandle(IcmpHandle:DWORD):DWORD; stdcall; external 'icmp.dll' name
'IcmpCloseHandle';
function IcmpSendEcho(IcmpHandle,DestinationAddress:DWORD; RequestData:PChar;
RequestSize,RequestOptions:DWORD; var ReplyBuffer:ICMP_ECHO_REPLY;
ReplySize,Timeout:DWORD):DWORD; stdcall; external 'icmp.dll' name 'IcmpSendEcho';

function LookupName(const Name:string):TInAddr;
var HostEnt:PHostEnt; InAddr:TInAddr;
begin
HostEnt:=gethostbyname(PChar(Name));
FillChar(InAddr,SizeOf(InAddr),0);
if HostEnt<>nil then
begin
with InAddr,HostEnt^ do
begin
S_un_b.s_b1:=h_addr^[0];
S_un_b.s_b2:=h_addr^[1];
S_un_b.s_b3:=h_addr^[2];
S_un_b.s_b4:=h_addr^[3];
end;
end;
Result:=InAddr;
end;

function DoPing(sAddress:string; var Reply:ICMP_ECHO_REPLY):LongInt;
var hIcmp:DWORD; lAddress:LongInt; lTimeOut:DWORD; StringToSend:string;
begin
StringToSend:='hello there'; // данные для отправки
lTimeOut:=2000; // (мс) ICMP (пинг) таймаут
lAddress:=u_long(LookupName(PChar(sAddress)));
if (lAddress=-1)or(lAddress=0) then // если был IP-адрес строкой то по-другому
lAddress:=inet_addr(PChar(sAddress));
if (lAddress<>-1)and(lAddress<>0) then
begin
hIcmp:=IcmpCreateFile;
if hIcmp = 0 then Result:=ICMP_STATUS_GENERAL_FAILURE
else
begin // пинговать IP
IcmpSendEcho(hIcmp,lAddress,PChar(StringToSend),
Length(StringToSend),0,Reply,SizeOf(Reply),lTimeOut);
Result:=Reply.Status; // требуемый статус ответа
IcmpCloseHandle(hIcmp);
end;
end
else Result:=ICMP_STATUS_DESTINATION_HOST_UNREACH;
end;

function EvaluatePingResponse(PingResponse:DWORD):string;
begin
case PingResponse of
// Success
ICMP_SUCCESS: EvaluatePingResponse:='Success!';
// Some error occurred
ICMP_STATUS_BUFFER_TO_SMALL: EvaluatePingResponse:='Buffer Too Small';
ICMP_STATUS_DESTINATION_NET_UNREACH: EvaluatePingResponse:='Destination Net
Unreachable';
ICMP_STATUS_DESTINATION_HOST_UNREACH: EvaluatePingResponse:='Destination Host
Unreachable';
ICMP_STATUS_DESTINATION_PROTOCOL_UNREACH: EvaluatePingResponse:='Destination
Protocol Unreachable';
ICMP_STATUS_DESTINATION_PORT_UNREACH: EvaluatePingResponse:='Destination Port
Unreachable';
ICMP_STATUS_NO_RESOURCE: EvaluatePingResponse:='No Resources';
ICMP_STATUS_BAD_OPTION: EvaluatePingResponse:='Bad Option';
ICMP_STATUS_HARDWARE_ERROR: EvaluatePingResponse:='Hardware Error';
ICMP_STATUS_LARGE_PACKET: EvaluatePingResponse:='Packet Too Big';
ICMP_STATUS_REQUEST_TIMED_OUT: EvaluatePingResponse:='Request Timed Out';
ICMP_STATUS_BAD_REQUEST: EvaluatePingResponse:='Bad Request';
ICMP_STATUS_BAD_ROUTE: EvaluatePingResponse:='Bad Route';
ICMP_STATUS_TTL_EXPIRED_TRANSIT: EvaluatePingResponse:='TimeToLive Expired
Transit';
ICMP_STATUS_TTL_EXPIRED_REASSEMBLY: EvaluatePingResponse:='TimeToLive Expired
Reassembly';
ICMP_STATUS_PARAMETER: EvaluatePingResponse:='Parameter Problem';
ICMP_STATUS_SOURCE_QUENCH: EvaluatePingResponse:='Source Quench';
ICMP_STATUS_OPTION_TOO_BIG: EvaluatePingResponse:='Option Too Big';
ICMP_STATUS_BAD_DESTINATION: EvaluatePingResponse:='Bad Destination';
ICMP_STATUS_NEGOTIATING_IPSEC: EvaluatePingResponse:='Negotiating IPSEC';
ICMP_STATUS_GENERAL_FAILURE: EvaluatePingResponse:='General Failure';
else EvaluatePingResponse:='Unknown Response';
end;
end;

function IsIPHostUp(Address:string):Boolean;
var Reply:ICMP_ECHO_REPLY; TryCount:Integer; WSAD:WSADATA; Status:DWORD;
begin
while (Length(Address)>0)and(Address[1] in [#32,'\','/']) do Delete(Address,1,1);
if WSAStartup(WS_VERSION_REQD,WSAD) = ICMP_SUCCESS then
begin
TryCount:=0;
repeat
Status:=DoPing(Address,Reply);
case Status of
ICMP_SUCCESS: Result:=True;
ICMP_STATUS_REQUEST_TIMED_OUT,ICMP_STATUS_DESTINATION_HOST_UNREACH:
Result:=False;
else raise Exception.Create('Ошибка ping: '+EvaluatePingResponse(Status));
end;
Inc(TryCount);
until (Result)or(TryCount>=4);
WSACleanup;
end
else raise Exception.Create('Winsock error failure');
end;

end.


Roman Denisoff

unread,
Nov 12, 2005, 3:25:39 PM11/12/05
to
· ···Приветствую, Igor!

Письмо от 08.11.2005, Igor Yegorkin ==> Roman Krivtsov,

IY> From: "Igor Yegorkin" <yego...@ukrpost.net>

IY> Hi, Roman Krivtsov

>> Как пропинговать комп в локальной сети(можно и по очереди). Hужно, чтобы
>> было это реализовано полностью на делфи, т.е. я сам задал максимальное время
>> ожидания, и пакетов было отправлено не 4, а скока напишу.

А случаем некто не скажет возможно в ICMP протокол инкапсулировать TCP/IP
поток? (у нас в сетке пинги проходят а данные нет)

С наилучшими пожеланиями,
Roman!

Igor Yegorkin

unread,
Nov 13, 2005, 3:35:58 PM11/13/05
to
Roman Denisoff

> А случаем некто не скажет возможно в ICMP протокол инкапсулировать TCP/IP
> поток? (у нас в сетке пинги проходят а данные нет)

А настроить сеть никак нельзя? Или админы мешают?

Трафик спрятать можно куда угодно. По DNS-запросам умельцы ходили в инет
через ограниченный бесплатный тестовый дозвон к провайдерам.

По поводу ICMP. Сам такого не делал :) но скачай пакет для перехвата
пакетов в сети на своём сетевом интерфейсе - дрова PCap с исходниками.
Пиши эхотажную прогу для получения данных через этот драйвер. Отправлять
данные можно через приведённый ранее код.


0 new messages