Windows mendukung Internet Control Message Protocol (ICMP) untuk menentukan apakah host tertentu tersedia atau tidak. ICMP adalah protokol lapisan jaringan yang memberikan kontrol aliran, pesan kesalahan, perutean, dan data lainnya antara host Internet. ICMP terutama digunakan oleh pengembang aplikasi untuk ping jaringan.
Apa itu Ping?
Ping adalah proses mengirim pesan gema ke alamat IP dan membaca balasan untuk memverifikasi koneksi antara Host TCP / IP. Jika Anda menulis aplikasi baru, Anda akan lebih baik menggunakan dukungan soket mentah Winsock 2, yang diimplementasikan di Indy, sebagai contoh.
Harap dicatat, bahwa untuk implementasi Windows NT dan Windows 2000, Raw Sockets dapat diperiksa keamanan dan hanya dapat diakses oleh anggota grup administrator. Icmp.dll menyediakan fungsionalitas yang memungkinkan pengembang untuk menulis aplikasi ping Internet pada sistem Windows tanpa dukungan Winsock 2.
Perhatikan bahwa fungsi WSAStartup Winsock 1.1 harus dipanggil sebelum menggunakan fungsi yang diekspos oleh ICMP.DLL. Jika Anda tidak melakukan ini, panggilan pertama ke IcmpSendEcho akan gagal dengan kesalahan 10091 (WSASYSNOTREADY).
Di bawah ini Anda dapat menemukan kode sumber unit Ping. Berikut adalah dua contoh penggunaan.
Contoh 1: Cuplikan Kode
menggunakan Ping; ...
const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf Ping. Ping (ADP_IP) kemudian ShowMessage ('Tentang Pemrograman Delphi yang dapat dijangkau!');
akhir;
Contoh 2: Program Delphi Mode Konsol
Contoh kami berikutnya adalah mode konsol Program delphi yang menggunakan unit Ping:. Inilah sumber unit Ping:
satuan Ping;
antarmuka pengguna
Windows, SysUtils, Kelas;
Tipe
TSunB = catatan dikemas
s_b1, s_b2, s_b3, s_b4: byte;
akhir;
TSunW = catatan dikemas
s_w1, s_w2: word;
akhir;
PIPAddr = ^ TIPAddr;
TIPAddr = merekam
kasus bilangan bulat dari
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
akhir; IPAddr = TIPAddr;
fungsi IcmpCreateFile: THandle; stdcall; luar 'icmp.dll';
fungsi IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; luar 'icmp.dll'
fungsi IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Batas waktu: DWORD): DWORD; stdcall; luar 'icmp.dll';
fungsi Ping (InetAddress: tali): boolean;
implementasinyamenggunakan
WinSock;
fungsi Mengambil(var AInput: tali;
const ADelim: tali = ' ';
const ADelete: Boolean = true)
: tali;
var
iPos: Integer;
mulai
jika ADelim = # 0 lalu mulai
// AnsiPos tidak berfungsi dengan # 0
iPos: = Pos (ADelim, AInput);
akhir pun dimulai
iPos: = Pos (ADelim, AInput);
akhir;
jika iPos = 0 lalu mulai
Hasil: = AInput;
jika Adelete lalu mulai
AInput: = '';
akhir;
akhir pun dimulai
hasil: = Salin (AInput, 1, iPos - 1);
jika Adelete lalu mulai
Hapus (AInput, 1, iPos + Panjang (ADelim) - 1);
akhir;
akhir;
akhir;
prosedur TranslateStringToTInAddr (AIP: tali; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
mulai
WSAStartup ($ 101, GInitData);
mencoba
phe: = GetHostByName (PChar (AIP));
jika Ditugaskan (phe) maka mulailah
pac: = phe ^ .h_addr_list ^;
jika Ditugaskan (pac) kemudian
mulai
dengan TIPAddr (AInAddr) .S_un_b mulai
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
akhir;
akhir
lain
mulai
menaikkan Pengecualian. Buat ('Kesalahan mendapatkan IP dari HostName');
akhir;
akhir
lain
mulai
menaikkan Pengecualian. Buat ('Kesalahan mendapatkan Nama Host');
akhir;
kecuali
FillChar (AInAddr, SizeOf (AInAddr), # 0);
akhir; WSACleanup;
akhir;
fungsi Ping (InetAddress: tali): boolean;
var
Menangani: thandle;
InAddr: IPAddr;
DW: DWORD;
reputasi: Himpunan[1..128] dari byte;
mulai
hasil: = salah; Tangani: = IcmpCreateFile;
jika Handle = INVALID_HANDLE_VALUE kemudian
Keluar;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nol, 0, nol, @rep, 128, 0); Hasil: = (DW 0); IcmpCloseHandle (Menangani);
akhir;
akhir.