Menerapkan PING Tanpa Menggunakan Soket Mentah

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

instagram viewer

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
.
instagram story viewer