Implementazione di PING senza utilizzare socket non elaborati

finestre supporta un protocollo ICMP (Internet Control Message Protocol) per determinare se è disponibile o meno un determinato host. ICMP è un protocollo a livello di rete che fornisce controllo del flusso, messaggi di errore, routing e altri dati tra host Internet. ICMP viene utilizzato principalmente dagli sviluppatori di applicazioni per un ping di rete.

Che cos'è un ping?

Un ping è il processo di invio di un messaggio di eco a un indirizzo IP e la lettura della risposta per verificare una connessione tra Host TCP / IP. Se stai scrivendo una nuova applicazione, sarà meglio utilizzare il supporto socket grezzi di Winsock 2, implementato in Indy, per esempio.

Si noti, tuttavia, che per le implementazioni di Windows NT e Windows 2000, Raw Socket è soggetto a controlli di sicurezza e è accessibile solo ai membri del gruppo dell'amministratore. Icmp.dll offre funzionalità che consentono agli sviluppatori di scrivere applicazioni ping su Internet su sistemi Windows senza il supporto di Winsock 2.

instagram viewer

Si noti che la funzione WSAStartup di Winsock 1.1 deve essere chiamata prima di utilizzare le funzioni esposte da ICMP.DLL. In caso contrario, la prima chiamata a IcmpSendEcho avrà esito negativo con errore 10091 (WSASYSNOTREADY).

Di seguito puoi trovare il codice sorgente dell'unità Ping. Ecco due esempi di utilizzo.

Esempio 1: frammento di codice

usi Ping; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) poi ShowMessage ('Informazioni sulla programmazione Delphi raggiungibile!');
fine
;

Esempio 2: Programma Delphi in modalità console

Il nostro prossimo esempio è una modalità console Programma Delphi che utilizza l'unità Ping:. Ecco la fonte dell'unità Ping:

unità ping;
interfaceuses

Windows, SysUtils, Classi;
genere

TSunB = record imballato
s_b1, s_b2, s_b3, s_b4: byte;
fine
;
TSunW = record imballato
s_w1, s_w2: parola;
fine
;
PIPAddr = ^ TIPAddr;
TIPAddr = disco
Astuccio
numero intero di
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
fine
; IPAddr = TIPAddr;
funzione
IcmpCreateFile: THandle; stdcall; esterno 'Icmp.dll';
funzione
IcmpCloseHandle (icmpHandle: THandle): booleano;
stdcall
; esterno 'Icmp.dll'
funzione
ICMPSendEcho
(IcmpHandle: THandle; Indirizzo di destinazione: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: puntatore;
RispondiSize: DWORD;
Timeout: DWORD): DWORD; stdcall; esterno 'Icmp.dll';
funzione
Ping (InetAddress: corda): booleano;
implementationuses

WinSock;
funzione
Fetch (var ainput: corda;
const
ADelim: corda = ' ';
const
ADelete: Boolean = true)
: corda;
var

iPos: intero;
inizio
Se
ADelim = # 0 quindi iniziare
// AnsiPos non funziona con # 0

iPos: = Pos (ADelim, AInput);
fine altrimenti inizia

iPos: = Pos (ADelim, AInput);
fine
;
Se
iPos = 0 quindi iniziare
Risultato: = AInput;
Se
ACANC quindi iniziare
AInput: = '';
fine
;
fine altrimenti inizia

risultato: = Copia (AInput, 1, iPos - 1);
Se
ACANC quindi iniziare
Elimina (AInput, 1, iPos + Lunghezza (ADelim) - 1);
fine
;
fine
;
fine
;
procedura
TranslateStringToTInAddr (AIP: corda; var AInAddr);
var

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

WSAStartup ($ 101, GInitData);
provare

phe: = GetHostByName (PChar (AIP));
Se
Assegnato (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
Se
Assegnato (pac) poi
inizio
con
TIPAddr (AInAddr) .S_un_b iniziare
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
fine
;
fine
altro
inizio
aumentare
Eccezione. Crea ('Errore nell'acquisizione dell'IP da Nomehost');
fine
;
fine
altro
inizio
aumentare
Eccezione. Crea ("Errore nell'ottenere nome host");
fine
;
tranne

FillChar (AInAddr, SizeOf (AInAddr), # 0);
fine
; WSACleanup;
fine
;
funzione
Ping (InetAddress: corda): booleano;
var

Maniglia: THandle;
InAddr: IPAddr;
DW: DWORD;
rappresentante: Vettore[1..128] di byte;
inizio

risultato: = false; Handle: = IcmpCreateFile;
Se
Handle = INVALID_HANDLE_VALUE poi
Uscita;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, zero, 0, zero, @rep, 128, 0); Risultato: = (DW 0); IcmpCloseHandle (Handle);
fine
;​
fine
.
instagram story viewer