Implementace PING bez použití surových soketů

Okna podporuje protokol ICMP (Internet Control Message Protocol) k určení, zda je konkrétní hostitel k dispozici. ICMP je protokol síťové vrstvy, který poskytuje řízení toku, chybové zprávy, směrování a další data mezi internetovými hostiteli. ICMP je primárně používán vývojáři aplikací pro ping sítě.

Co je to Ping?

Ping je proces odeslání echo zprávy na IP adresu a přečtení odpovědi pro ověření spojení mezi Hostitelé TCP / IP. Pokud píšete novou aplikaci, budete raději používat podporu surových soketů Winsock 2 implementovanou v systému Indy, například.

Nezapomeňte však, že v případě implementací Windows NT a Windows 2000 jsou Raw Sockets předmětem bezpečnostních kontrol a jsou přístupné pouze členům skupiny administrátora. Icmp.dll poskytuje funkce, které umožňují vývojářům psát aplikace Internet ping v systémech Windows bez podpory Winsock 2.

Všimněte si, že funkce Winsock 1.1 WSAStartup musí být volána před použitím funkcí vystavených ICMP.DLL. Pokud tak neučiníte, první volání IcmpSendEcho se nezdaří s chybou 10091 (WSASYSNOTREADY).

instagram viewer

Níže najdete zdrojový kód jednotky Ping. Zde jsou dva příklady použití.

Příklad 1: Úryvek kódu

použití Ping; ...
konst
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
začátek
Ping. Ping (ADP_IP) pak ShowMessage („O programu Delphi Programming dosažitelné!“);
konec
;

Příklad 2: Program konzoly v režimu Delphi

Naším dalším příkladem je režim konzoly Program Delphi používající jednotku Ping:. Zde je zdroj jednotky Ping:

jednotka Ping;
interfaceuses

Windows, SysUtils, třídy;
typ

TSunB = zabalený záznam
s_b1, s_b2, s_b3, s_b4: byte;
konec
;
TSunW = zabalený záznam
s_w1, s_w2: slovo;
konec
;
PIPAddr = ^ TIPAddr;
TIPAddr = záznam
pouzdro
celé číslo z
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
konec
; IPAddr = TIPAddr;
funkce
IcmpCreateFile: THandle; stdcall; externí 'icmp.dll';
funkce
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; externí 'icmp.dll'
funkce
IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Ukazatel; RequestSize: Smallint;
RequestOptions: ukazatel;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; externí 'icmp.dll';
funkce
Ping (InetAddress: tětiva): boolean;
implementace

WinSock;
funkce
Načíst (var Vstup: tětiva;
konst
ADelim: tětiva = ' ';
konst
ADelete: Boolean = true)
: tětiva;
var

iPos: Celé číslo;
začít
-li
ADelim = # 0 pak začít
// AnsiPos nefunguje s # 0

iPos: = Pos (ADelim, AInput);
konec jinak začíná

iPos: = Pos (ADelim, AInput);
konec
;
-li
iPos = 0 pak začít
Výsledek: = AInput;
-li
ADelete pak začít
AInput: = '';
konec
;
konec jinak začíná

výsledek: = Kopie (AInput, 1, iPos - 1);
-li
ADelete pak začít
Smazat (AInput, 1, iPos + Délka (ADelim) - 1);
konec
;
konec
;
konec
;
postup
TranslateStringToTInAddr (AIP: tětiva; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
začít

WSAStartup (101 $, GInitData);
Snaž se

phe: = GetHostByName (PChar (AIP));
-li
Přiřazeno (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
-li
Přiřazeno (pac) pak
začít
s
TIPAddr (AInAddr) .S_un_b začnou
s_b1: = byte (pac [0]); s_b2: = byte (pac [1]); s_b3: = byte (pac [2]); s_b4: = byte (pac [3]);
konec
;
konec
jiný
začít
vyzdvihnout
Výjimka. Vytvořit ('Chyba při získávání IP z HostName');
konec
;
konec
jiný
začít
vyzdvihnout
Výjimka. Create ('Chyba při získávání HostName');
konec
;
až na

FillChar (AInAddr, SizeOf (AInAddr), # 0);
konec
; WSACleanup;
konec
;
funkce
Ping (InetAddress: tětiva): boolean;
var

Rukojeť: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: pole[1..128] z byte;
začít

výsledek: = false; Popisovač: = IcmpCreateFile;
-li
Popisovač = INVALID_HANDLE_VALUE pak
Výstup;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nula, 0, nula, @rep, 128, 0); Výsledek: = (DWO); IcmpCloseHandle (Handle);
konec
;​
konec
.
instagram story viewer