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.
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.