حياة

تنفيذ PING بدون استخدام مآخذ خام

تنفيذ PING بدون استخدام مآخذ خام

يدعم Windows بروتوكول رسائل التحكم في الإنترنت (ICMP) لتحديد ما إذا كان هناك مضيف معين متاح أم لا. ICMP هو بروتوكول طبقة شبكة يوفر التحكم في التدفق ورسائل الخطأ والتوجيه والبيانات الأخرى بين مضيفي الإنترنت. يستخدم ICMP بشكل أساسي من قبل مطوري التطبيقات لإجراء اختبار شبكة.

ما هو بينغ؟

ping هي عملية إرسال رسالة صدى إلى عنوان IP وقراءة الرد للتحقق من الاتصال بين مضيفي TCP / IP. إذا كنت تكتب تطبيقًا جديدًا ، فمن الأفضل استخدام دعم مآخذ التوصيل الأولية Winsock 2 ، الذي تم تنفيذه في Indy ، على سبيل المثال.

ومع ذلك ، يرجى ملاحظة أنه بالنسبة لتطبيقات Windows NT و Windows 2000 ، فإن Raw Sockets تخضع لفحوصات أمنية ويمكن الوصول إليها فقط لأعضاء مجموعة المسئول. يوفر Icmp.dll وظيفة تسمح للمطورين بكتابة تطبيقات الإنترنت ping على أنظمة Windows دون دعم Winsock 2.

لاحظ أنه يجب استدعاء الدالة Winsock 1.1 WSAStartup قبل استخدام الدالات المكشوفة بواسطة ICMP.DLL. إذا لم تقم بذلك ، فسوف تفشل المكالمة الأولى إلى IcmpSendEcho بسبب الخطأ 10091 (WSASYSNOTREADY).

يمكنك العثور على الكود المصدري لوحدة Ping أدناه. فيما يلي مثالان للاستخدام.

مثال 1: مقتطف الشفرة

الاستخدامات بينج ؛ ...
CONST
ADP_IP = '208.185.127.40' ؛ (* //delphi.about.com *)
beginIf
Ping.Ping (ADP_IP) ثم ShowMessage ('حول دلفي البرمجة قابلة للوصول!') ؛
النهاية
;

مثال 2: برنامج وحدة وضع دلفي

مثالنا التالي هو وضع دلفي وضع وحدة التحكم الذي يستخدم وحدة بينغ:. إليك مصدر وحدة Ping:

وحدة بينغ.
interfaceuses

ويندوز ، SysUtils ، فئات.
نوع

تسونب = سجل معبأة
s_b1، s_b2، s_b3، s_b4: byte؛
النهاية
;
تسونو = سجل معبأة
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؛ DestinationAddress: IPAddr؛
RequestData: المؤشر ؛ حجم الطلب: Smallint.
RequestOptions: المؤشر ؛
ReplyBuffer: المؤشر ؛
ReplySize: DWORD؛
المهلة: DWORD): DWORD؛ STDCALL; خارجي "icmp.dll '؛
وظيفة
بينغ (InetAddress: خيط): منطقية.
implementationuses

WINSOCK.
وظيفة
جلب(فار AInput: خيط;
CONST
ADelim: خيط =";
CONST
الحاشية: منطقية = صواب)
: خيط;
فار

iPos: عدد صحيح
ابدأ
إذا
أديل = # 0 ثم ابدأ
// AnsiPos لا يعمل مع # 0

iPos: = Pos (ADelim، AInput)؛
نهاية آخر تبدأ

iPos: = Pos (ADelim، AInput)؛
النهاية
;
إذا
iPos = 0 ثم ابدأ
النتيجة: = AInput ؛
إذا
ADelete ثم ابدأ
الإدخال: = "؛
النهاية
;
نهاية آخر تبدأ

النتيجة: = نسخ (AInput ، 1 ، iPos - 1) ؛
إذا
ADelete ثم ابدأ
حذف (AInput ، 1 ، iPos + Length (ADelim) - 1) ؛
النهاية
;
النهاية
;
النهاية
;
إجراء
TranslateStringToTInAddr (AIP: خيط; فار AInAddr)؛
فار

phe: PHostEnt؛ pac: PChar؛ GInitData: TWSAData؛
ابدأ

WSAStartup ($ 101 ، GInitData) ؛
محاولة

phe: = GetHostByName (PChar (AIP)) ؛
إذا
تعيين (PHE) thenbegin
pac: = phe ^ .h_addr_list ^؛
إذا
تعيين (باك) ثم
ابدأ
مع
TIPAddr (AInAddr) .S_un_b هل تبدأ
s_b1: = البايت (pac0) ؛ s_b2: = البايت (pac1) ؛ s_b3: = البايت (pac2) ؛ s_b4: = البايت (pac3) ؛
النهاية
;
النهاية
آخر
ابدأ
ربى
Exception.Create ('خطأ في الحصول على IP من HostName') ؛
النهاية
;
النهاية
آخر
ابدأ
ربى
Exception.Create ('خطأ في الحصول على اسم المضيف') ؛
النهاية
;
إلا

FillChar (AInAddr، SizeOf (AInAddr)، # 0)؛
النهاية
، WSACleanup.
النهاية
;
وظيفة
بينغ (InetAddress: خيط): منطقية.
فار

مقبض: THandle ؛
InAddr: IPAddr؛
DW: DWORD ؛
مندوب: مجموعة مصفوفة1… 128 من بايت؛
ابدأ

النتيجة: = خطأ ؛ المؤشر: = IcmpCreateFile ؛
إذا
المؤشر = INVALID_HANDLE_VALUE ثم
ىخرج؛
TranslateStringToTInAddr (InetAddress، InAddr)؛
DW: = IcmpSendEcho (المؤشر ، InAddr ، صفر, 0, صفر،rep ، 128 ، 0) ؛ النتيجة: = (DW 0) ؛ IcmpCloseHandle (Handle) ؛
النهاية
;​
النهاية
.