Ham Soketler Kullanmadan PING Uygulaması

pencereler belirli bir ana bilgisayarın kullanılabilir olup olmadığını belirlemek için bir Internet Denetim İletisi Protokolü'nü (ICMP) destekler. ICMP, Internet ana bilgisayarları arasında akış denetimi, hata mesajları, yönlendirme ve diğer verileri sağlayan bir ağ katmanı protokolüdür. ICMP öncelikle uygulama geliştiricileri tarafından bir ağ ping işlemi için kullanılır.

Ping Nedir?

Ping, IP adresine bir yankı mesajı gönderme ve arasındaki bağlantıyı doğrulamak için yanıtı okuma işlemidir TCP / IP ana bilgisayarları. Yeni bir uygulama yazıyorsanız, içinde uygulanan Winsock 2 ham yuva desteğini kullanmak daha iyi olacaktır. Indy, Örneğin.

Ancak, Windows NT ve Windows 2000 uygulamaları için Raw Sockets güvenlik denetimlerine tabi olduğunu ve yalnızca yönetici grubunun üyeleri tarafından erişilebilir olduğunu lütfen unutmayın. Icmp.dll, geliştiricilerin Windows sistemlerine Winsock 2 desteği olmadan Internet ping uygulamaları yazmasına olanak tanıyan işlevler sağlar.

Winsock 1.1 WSAStartup işlevi ICMP.DLL tarafından maruz bırakılan işlevleri kullanmadan önce çağrılması gerektiğini unutmayın. Bunu yapmazsanız, ilk IcmpSendEcho çağrısı 10091 hatasıyla (WSASYSNOTREADY) başarısız olur.

instagram viewer

Aşağıda Ping biriminin kaynak kodunu bulabilirsiniz. İşte iki kullanım örneği.

Örnek 1: Kod Parçacığı

kullanımları Ping; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) sonra ShowMessage ('Delphi Programlama'ya ulaşılabilir!');
son
;

Örnek 2: Konsol Modu Delphi Programı

Bir sonraki örneğimiz bir konsol modu Delphi programı Ping birimini kullanan: Ping biriminin kaynağı:

birim Ping;
interfaceuses

Windows, SysUtils, Sınıflar;
tip

TSunB = paketlenmiş kayıt
dosyalama1, dosyalama2, dosyalama3, dosyalama4: bayt;
son
;
TSunW = paketlenmiş kayıt
s_w1, s_w2: sözcük;
son
;
PIPAddr = ^ TIPAddr;
TIPAddr = kayıt
durum
tamsayı nın-nin
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
son
; IPAddr = TIPAddr;
fonksiyon
IcmpCreateFile: Thandle; stdcall; dış 'İcmp.dll';
fonksiyon
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; dış 'İcmp.dll'
fonksiyon
IcmpSendEcho
(IcmpHandle: Thandle; HedefAdresi: IPAddr;
RequestData: İşaretçi; RequestSize: Küçük;
RequestOptions: işaretçi;
ReplyBuffer: İşaretçi;
ReplySize: DWORD;
Zaman aşımı: DWORD): DWORD; stdcall; dış 'İcmp.dll';
fonksiyon
Ping (InetAddress: sicim): boolean;
implementationuses

WinSock;
fonksiyon
(Getirmevar AInput: sicim;
const
ADelim: sicim = ' ';
const
ADelete: Boolean = doğru)
: sicim;
var

iPos: Tamsayı;
başla
Eğer
ADelim = # 0 o zaman başla
// AnsiPos # 0 ile çalışmıyor

iPos: = Konum (ADelim, AInput);
başka son başlar

iPos: = Konum (ADelim, AInput);
son
;
Eğer
iPos = 0 o zaman başla
Sonuç: = AInput;
Eğer
ADelete o zaman başla
AInput: = '';
son
;
başka son başlar

sonuç: = Kopyala (AInput, 1, iPos - 1);
Eğer
ADelete o zaman başla
Sil (AInput, 1, iPos + Uzunluk (ADelim) - 1);
son
;
son
;
son
;
prosedür
TranslateStringToTInAddr (AIP: sicim; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
başla

WSAStartup ($ 101, GInitData);
Deneyin

phe: = GetHostByName (PChar (AIP));
Eğer
Atandı (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
Eğer
Atandı (pac) sonra
başla
ile
TIPAddr (AInAddr) .S_un_b başla
yüzükçü1: = Bayt (pac [0]); yüzükçü2: = Bayt (pac [1]);
son
;
son
Başka
başla
yükseltmek
İstisna. Oluştur ('Ana MakineAdından IP alınırken hata oluştu');
son
;
son
Başka
başla
yükseltmek
İstisna. Oluştur ('Ana MakineAdı alınırken hata oluştu');
son
;
dışında

FillChar (AInAddr, SizeOf (AInAddr), # 0);
son
; WSACleanup;
son
;
fonksiyon
Ping (InetAddress: sicim): boolean;
var

Kolu: Thandle;
InAddr: IPAddr;
DW: DWORD;
rep: dizi[1..128] nın-nin bayt;
başla

sonuç: = yanlış; Tanıtıcı: = IcmpCreateFile;
Eğer
Tanıtıcı = INVALID_HANDLE_VALUE sonra
Çıkış;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Tanıtıcı, InAddr, sıfır, 0, sıfır, @rep, 128, 0); Sonuç: = (DW0); IcmpCloseHandle (Kulp);
son
;​
son
.
instagram story viewer