חלונות תומך בפרוטוקול הודעה של בקרת אינטרנט (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 ('ניתן להגיע לתכנות דלפי!');
סוף;
דוגמה 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 (ידית);
סוף;
סוף.