PING implementeren zonder Raw Sockets te gebruiken

ramen ondersteunt een Internet Control Message Protocol (ICMP) om te bepalen of een bepaalde host al dan niet beschikbaar is. ICMP is een netwerklaagprotocol dat stroomcontrole, foutmeldingen, routing en andere gegevens tussen internethosts levert. ICMP wordt voornamelijk gebruikt door applicatieontwikkelaars voor een netwerkping.

Wat is een ping?

Een ping is het proces van het verzenden van een echobericht naar een IP-adres en het lezen van het antwoord om een ​​verbinding tussen te verifiëren TCP / IP-hosts. Als u een nieuwe applicatie schrijft, kunt u beter de Winsock 2 raw sockets-ondersteuning gebruiken, geïmplementeerd in Indy, bijvoorbeeld.

Houd er echter rekening mee dat Raw Sockets voor Windows NT- en Windows 2000-implementaties onderhevig zijn aan beveiligingscontroles en alleen toegankelijk zijn voor leden van de beheerdersgroep. Icmp.dll biedt functionaliteit waarmee ontwikkelaars internet-ping-toepassingen kunnen schrijven op Windows-systemen zonder Winsock 2-ondersteuning.

instagram viewer

Merk op dat de Winsock 1.1 WSAStartup-functie moet worden aangeroepen voordat de functies worden gebruikt die worden weergegeven door ICMP.DLL. Als u dit niet doet, mislukt de eerste aanroep van IcmpSendEcho met fout 10091 (WSASYSNOTREADY).

Hieronder vindt u de broncode van de Ping-eenheid. Hier zijn twee voorbeelden van gebruik.

Voorbeeld 1: Codefragment

toepassingen Ping;...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginnen als
Ping. Ping (ADP_IP) vervolgens ShowMessage ('Over Delphi Programming bereikbaar!');
einde
;

Voorbeeld 2: Console Mode Delphi Program

Ons volgende voorbeeld is een consolemodus Delphi-programma die de Ping-eenheid gebruikt:. Hier is de bron van de Ping-eenheid:

eenheid Ping;
interfaceuses

Windows, SysUtils, Klassen;
type

TSunB = verpakt record
s_b1, s_b2, s_b3, s_b4: byte;
einde
;
TSunW = verpakt record
s_w1, s_w2: woord;
einde
;
PIPAddr = ^ TIPAddr;
TIPAddr = Vermelding
geval
geheel getal van
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: langwoord);
einde
; IPAddr = TIPAddr;
functie
IcmpCreateFile: THandle; stdcall; extern 'icmp.dll';
functie
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; extern 'icmp.dll'
functie
IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Aanwijzer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Time-out: DWORD): DWORD; stdcall; extern 'icmp.dll';
functie
Ping (InetAddress: draad): boolean;
implementatie

WinSock;
functie
Ophalen (var AInvoer: draad;
const
ADelim: draad = ' ';
const
ADelete: Boolean = true)
: draad;
var

iPos: geheel getal;
beginnen
als
ADelim = # 0 begin dan
// AnsiPos werkt niet met # 0

iPos: = Pos (ADelim, AInput);
anders begint

iPos: = Pos (ADelim, AInput);
einde
;
als
iPos = 0 begin dan
Resultaat: = AInput;
als
ADelete begin dan
AInput: = '';
einde
;
anders begint

resultaat: = Kopiëren (AInput, 1, iPos - 1);
als
ADelete begin dan
Verwijderen (AInput, 1, iPos + Length (ADelim) - 1);
einde
;
einde
;
einde
;
procedure
TranslateStringToTInAddr (AIP: draad; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
beginnen

WSAStartup ($ 101, GInitData);
proberen

phe: = GetHostByName (PChar (AIP));
als
Toegekend (phe) dan beginnen
pac: = phe ^ .h_addr_list ^;
als
Toegewezen (pac) vervolgens
beginnen
met
TIPAddr (AInAddr) .S_un_b beginnen
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
einde
;
einde
anders
beginnen
verhogen
Uitzondering. Create ('Fout bij ophalen van IP van HostName');
einde
;
einde
anders
beginnen
verhogen
Uitzondering. Create ('Fout bij ophalen HostName');
einde
;
behalve

FillChar (AInAddr, SizeOf (AInAddr), # 0);
einde
; WSACleanup;
einde
;
functie
Ping (InetAddress: draad): boolean;
var

Handvat: handvat;
InAddr: IPAddr;
DW: DWORD;
vertegenwoordiger: matrix[1..128] van byte;
beginnen

resultaat: = false; Handvat: = IcmpCreateFile;
als
Handle = INVALID_HANDLE_VALUE vervolgens
Uitgang;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nihil, 0, nihil, @rep, 128, 0); Resultaat: = (DW 0); IcmpCloseHandle (Handle);
einde
;​
einde
.
instagram story viewer