Delphi verwendet ICMP, um festzustellen, ob der Remote -Host lebt
2005-03-10 JLBNET
In der Netzwerkkommunikation ist häufig festzustellen, ob der Remote -Host lebt, um die im nächsten Teil durchgeführte Operation zu bestimmen. Es kann direkt unter Verwendung des ICMP -Protokolls implementiert werden, aber es müssen viele Protokolldetails berücksichtigt werden, was problematischer zu implementieren ist. In der ICMP-Bibliothek befinden sich fertige Funktionen, die mit Windows geliefert werden, und füllen Sie einfach die entsprechende Datenstruktur vor der Verwendung.
Das Folgende ist die zu verwendende Datenstruktur. Diese Strukturen MSDN haben Erklärungen in Form C und hier wird die Form von Delphi angegeben.
// Die verwendete Protokolldatenstruktur
PiptionInfo = ^TipoptionInfo;
TipoptionInfo = verpackter Datensatz
Ttl: byte; // Lebenszeit
TOS: BYTE; // Servicetyp, Anforderungstyp
Flaggen: Byte; // Lotterie
Optionssize: Byte; // Optionslänge
Optionsdata: pchar; // Optionsdaten
Ende;
Picmpechoreply = ^ticmpechoreply;
Ticmpechoreply = verpackter Datensatz // ICMP -Rückgabeinformationen
Adresse: DWORD; // IP -Adresse
Status: DWORD; // Status
RTT: DWORD;
DataSize: Word; // Datenlänge
Reserviert: Wort; // Reserve
Daten: Zeiger; // Daten
Optionen: TipoptionInfo; // Optionsbereich
Ende;
// Funktionserklärung in der dynamischen Bibliothek
TICMPCreateFile = Funktion: Thandle;
TICMPCLOSEHANDLE = Funktion (ICMPHandle: THANDLE): boolean;
TICMpSendecho = Funktion (ICMPHandle: Thandle; DestinationAddress: DWORD;
RequestData: Zeiger;
ReplyBuffer: Zeiger;
// Die zu verwendende Variablenerklärung
HICMPDLL, HICMP: Thandle;
Wsadata: Twsadata;
ICMPCreateFile: TICMPCreateFile;
ICMPCLOSEHANDLE: TICMPCLOSEHANDLE;
ICMpendendecho: ticmpendendecho;
// destip: Die zu erkennende Remoteadresse ist wie 192.168.1.1
Prozedur f_checkonline (destip: string);
var
IPOPT: TipOptionInfo; // Paket -IP -Optionen
IPadDR: DWORD;
preqdata, precdata: pchar;
Rohr: picmpechoreply; // ICMP Echo Antwortpuffer
FSIZE: DWORD;
MyString: String;
FTimeout: DWORD;
Puffergröße: DWORD;
I: Ganzzahl;
Beginnen
HICMPDLL: = loadLibrary ('icmp.dll'); // Klicken Sie auf die dynamische ICMP -Bibliothek
Wenn Hicmpdll <> null dann
Beginnen
Wsastartup ($ 101, WSADATA); // Initialisieren Sie den Netzwerkprotokollstapel
@ICMPCreateFile: = getProcaddress (HICMPDLL, 'ICMPCreateFile'); // Bitte die Exportfunktion in der dynamischen Bibliothek
@ICMPCLOSEHANDLE: = GetProcaddress (HICMPDLL, 'ICMPCLOSEHandle');
@ICMpsendecho: = GetProcaddress (HICMPDLL, 'ICMPSendecho');
HICMP: = ICMPCreateFile; // Erstellen Sie einen ICMP -Handle
IPaddr: = inet_addr (pchar (destip)); // Erhalten Sie die IP -Adresse des zu erkennenden Remote -Hosts
FSize: = 40;
Puffersize: = sizeof (ticmpechoreply) + fSize;
GetMem (prevdata, fSize);
GetMem (Pfeife, puffersize);
Fillchar (Rohr^, sizeof (Rohr^), 0);
Pipe^.data: = prevdata;
MyString: = 'Hallo, online?'; // willkürliche Zeichenfolge
preqdata: = pchar (mystring);
FillChar (ipopt, sizeof (ipopt), 0);
Ipopt.ttl: = 64;
FTimeout: = 500; // Wartezeit
i: = icmpendecho (HICMP, iPaddr, preqdata, Länge (MyString), @ipopt, pipe, puffersize, fTimeout); // Wenn es eine Rückgabe gibt, gibt der Rückgabewert die Anzahl der empfangenen Antworten an. Wenn 0 keine Antwort bedeutet, kann der Host nicht erreichen
Freemem (Prevdata);
Freemem (Pfeife);
ICMPCLOSEHandle (HICMP);
Freelibrary (HICMPDLL); // Dynamische Bibliothek freigeben
WsacleanUp (); // den Protokollstapel reinigen
Ende;
Ende;