הטמעת PING מבלי להשתמש בשקעים גולמיים

חלונות תומך בפרוטוקול הודעה של בקרת אינטרנט (ICMP) כדי לקבוע אם מארח מסוים זמין או לא. ICMP הוא פרוטוקול שכבת רשת המספק בקרת זרימה, הודעות שגיאה, ניתוב ונתונים אחרים בין מארחי האינטרנט. ICMP משמש בעיקר על ידי מפתחי יישומים עבור פינג רשת.

מה זה פינג?

פינג הוא תהליך שליחת הודעת הד לכתובת IP וקריאת התשובה כדי לאמת קשר בין מארחי TCP / IP. אם אתה כותב יישום חדש, עדיף שתשתמש בתמיכת שקעי הגלם של Winsock 2, המיושמת ב- אינדי, לדוגמה.

עם זאת, שים לב כי עבור יישומים של Windows NT ו- Windows 2000, שקעים גולמיים כפופים לבדיקות אבטחה ונגישים רק לחברי קבוצת המנהל. Icmp.dll מספק פונקציונליות המאפשרת למפתחים לכתוב יישומי פינג באינטרנט במערכות Windows ללא תמיכה ב- Winsock 2.

שים לב כי יש להתקשר לפונקצית Winsock 1.1 WSAStartup לפני השימוש בפונקציות שנחשפו על ידי ICMP.DLL. אם לא תעשה זאת, השיחה הראשונה ל- IcmpSendEcho תיכשל בשגיאה 10091 (WSASYSNOTREADY).

להלן תוכלו למצוא את קוד המקור של יחידת הפינג. להלן שתי דוגמאות לשימוש.

דוגמה 1: קטע קוד

שימושים פינג; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
התחל
פינג. פינג (ADP_IP) לאחר מכן ShowMessage ('ניתן להגיע לתכנות דלפי!');
סוף
;
instagram viewer

דוגמה 2: תוכנית דלפי של קונסולה

הדוגמה הבאה שלנו היא מצב קונסולה תוכנית דלפי המשתמשת ביחידת הפינג:. להלן המקור של יחידת הפינג:

יחידה פינג;
ממשקים

Windows, SysUtils, שיעורים;
סוג

TSunB = שיא ארוז
s_b1, s_b2, s_b3, s_b4: בתים;
סוף
;
TSunW = שיא ארוז
s_w1, s_w2: word;
סוף
;
PIPAddr = ^ TIPAddr;
TIPAddr = תקליט
מקרה
מספר שלם של
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
סוף
; IPAddr = TIPAddr;
פונקציה
IcmpCreateFile: THandle; stdcall; חיצוני 'icmp.dll';
פונקציה
IcmpCloseHandle (icmpHandle: THandle): בוליאני;
stdcall
; חיצוני 'icmp.dll'
פונקציה
IcmpSendEcho
(IcmpHandle: THandle; כתובת יעד: IPAddr;
בקשת נתונים: מצביע; גודל בקשה: Smallint;
RequestOptions: מצביע;
ReplyBuffer: מצביע;
תגובה בגודל: DWORD;
פסק זמן: DWORD): DWORD; stdcall; חיצוני 'icmp.dll';
פונקציה
פינג (InetAddress: מחרוזת): בוליאני;
יישומים

WinSock;
פונקציה
אחזר (var קלט: מחרוזת;
const
אדלים: מחרוזת = ' ';
const
ADelete: בוליאני = נכון)
: מחרוזת;
var

מכשירי אייפון: מספר שלם;
התחל
אם
אדלים = # 0 ואז התחל
// AnsiPos לא עובד עם מספר 0

מכשירי אייפון: = Pos (ADelim, AInput);
סוף אחר מתחיל

מכשירי אייפון: = Pos (ADelim, AInput);
סוף
;
אם
מכשירי אייפון = 0 ואז התחל
תוצאה: = קלט;
אם
אדלט ואז התחל
קלט: = '';
סוף
;
סוף אחר מתחיל

תוצאה: = העתק (קלט, 1, מכשירי אייפון - 1);
אם
אדלט ואז התחל
מחק (קלט, 1, iPos + אורך (עדלים) - 1);
סוף
;
סוף
;
סוף
;
תהליך
TranslateStringToTInAddr (AIP: מחרוזת; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
התחל

WSAStartup ($ 101, GInitData);
נסה

phe: = GetHostByName (PChar (AIP));
אם
הוקצה (phe) אז התחיל
pac: = phe ^ .h_addr_list ^;
אם
הוקצה (pac) לאחר מכן
התחל
עם
TIPAddr (AInAddr) .S_un_b אכן מתחילים
s_b1: = בייט (pac [0]); s_b2: = בייט (pac [1]); s_b3: = בייט (pac [2]); s_b4: = בייט (pac [3]);
סוף
;
סוף
אחר
התחל
העלאה
יוצא מן הכלל. צור ('שגיאה בהשגת IP מ- Host Host');
סוף
;
סוף
אחר
התחל
העלאה
יוצא מן הכלל. צור ('שגיאה בקבלת שם מארח');
סוף
;
מלבד

FillChar (AInAddr, SizeOf (AInAddr), # 0);
סוף
WSACleanup;
סוף
;
פונקציה
פינג (InetAddress: מחרוזת): בוליאני;
var

ידית: THandle;
InAddr: IPAddr;
DW: DWORD;
נציג: מערך[1..128] של בתים;
התחל

תוצאה: = שקר; ידית: = IcmpCreateFile;
אם
ידית = INVALID_HANDLE_VALUE לאחר מכן
יציאה;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (ידית, InAddr, אפס, 0, אפס, @rep, 128, 0); תוצאה: = (DW 0); IcmpCloseHandle (ידית);
סוף
;​
סוף
.
instagram story viewer