برمجة دلفي لتنفيذ عملية Ping
تشانغ تايلي
المستخدمون الذين استخدموا الإنترنت على دراية بالأمر "Ping" وهو ملف قابل للتنفيذ ضمن DOS ويستخدم بشكل عام للتحقق من جودة اتصال الشبكة. المبدأ الأساسي هو استخدام وظيفة في بروتوكول ICMP في حزمة بروتوكول TCP/ip، أي إرسال طلب إلى الكمبيوتر المحدد، ويقوم الكمبيوتر الذي يتلقى الطلب بإرجاع استجابة لتحديد ما إذا كان الكمبيوتر يعمل أم لا الإنترنت أو للتحقق من الشبكة هل الاتصال مستقر وموثوق؟ أثناء تنفيذ برنامج Ping، يستهلك كلا الجهازين موارد قليلة جدًا، لذا فهو أداة عملية للغاية.
يمكننا تنفيذ عملية "Ping" من خلال البرمجة وتحسينها بحيث يكون لها نمط واجهة Windows ويكون العرض أكثر سهولة من DOS.
أولاً، شرح مختصر لمكتبة الارتباط الديناميكي المطلوبة في البرمجة: في دليل النظام الخاص بنظام Windows، يمكنك العثور على ملف Icmp.dll. توفر مكتبة الارتباط الديناميكي هذه جميع وظائف بروتوكول ICMP نداء مكتبة الارتباط الديناميكي.
يتم وصف وظائف الاستدعاء في ملف Icmp.dll كما يلي:
1. إيكمبكريتيفيل
يفتح المؤشر الذي يمكنك من خلاله إرسال رسائل صدى لطلب ICMP.
2. إيكمبكلوسيهاندل
أغلق المقبض الذي قمت بفتحه من خلال الدالة IcmpCreateFile.
3. إيكمبسيند إيكو
قم بإرسال طلب ICMP من خلال المقبض الذي قمت بفتحه والعودة بعد انتهاء المهلة أو استلام رسالة الاستجابة. تتوافق معلماته بشكل أساسي مع بنية الإطار الخاصة به. يرجى الرجوع إلى جزء البرنامج أدناه لمعرفة معناه المحدد، يمكنك الرجوع إلى الكتب المتعلقة ببروتوكول ICMP.
بعد الفهم الأولي للوظائف الثلاث المذكورة أعلاه، يمكننا البدء في البرمجة.
أولاً، يجب أن يتمتع برنامجنا بالوظائف الأساسية الموضحة في الشكل 1 بعد التشغيل. للقيام بذلك، يمكننا أولاً وضع عناصر التحكم الموضحة في الصورة العلوية اليمنى في نافذة دلفي، مثل الأزرار، ومربعات التحرير، ومربعات عرض النص.
(G72.JPG)
رسم تخطيطي للتشغيل الروتيني
بعد ذلك، يتم تهيئة WinSocket في بداية البرنامج (FormCreate)، وتتمثل وظيفته في الإعلان عن معلومات الإصدار المستخدمة وفي نفس الوقت الاتصال بمكتبة Icmp.dll.
يكتب
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = سجل معبأ
TTL: بايت؛
شروط الخدمة: بايت؛
الأعلام: بايت؛
حجم الخيارات: بايت؛
بيانات الخيارات: PChar؛
نهاية؛
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = سجل معبأ
العنوان: DWord؛
الحالة: DWORD؛
RTT: DWORD؛
حجم البيانات: كلمة؛
محفوظة: كلمة؛
البيانات: المؤشر؛
الخيارات: TIPOptionInformation؛
نهاية؛
TICmpCreateFile = function: Thandle;
TICmpCloseHandle = function(IcmpHandle: Thandle): Boolean stdcall;
TicmpSendEcho = function(IcmpHandle:THandle;
عنوان الوجهة: DWORD؛
بيانات الطلب: المؤشر؛
حجم الطلب: كلمة؛
خيارات الطلب: معلومات بيبوبتيون؛
رد المخزن المؤقت: المؤشر؛
حجم الرد: DWord؛
المهلة: DWord
): DWord;
TMyPing = فئة (TForm)
اللوحة 1: لوحة T؛
التسمية 1: TLabel؛
تحرير بينغ: تيديت؛
ExeBtn: TButton؛
Button2: TButton؛
Button3: TButton؛
عرض الحالة: TMemo؛
زر الإجراء3Click(Sender: TObject);
الإجراء FormCreate(Sender: TObject);
الإجراء ExeBtnClick(Sender: TObject);
خاص
{تصريحات خاصة}
hICMP: ثاندل؛
IcmpCreateFile:TIcmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
عام
{التصريحات العامة}
نهاية؛
الإجراء TMyPing.FormCreate(Sender: TObject);
فار
وساداتا: توساداتا؛
hICMPdll: HMODULE;
يبدأ
WSAStartup(101 دولار، WSAData);
// قم بتحميل عناصر icmp.dll
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := ';
StatusShow.Lines.Add('وقت إرجاع بايت عنوان IP الوجهة (ملي ثانية)');
نهاية؛
بعد ذلك، حان الوقت لتنفيذ عملية البرمجة الفعلية لعملية Ping كما هو موضح أدناه.
الإجراء TMyPing.ExeBtnClick(Sender: TObject);
فار
IPOpt:TIPOptionInformation;//خيارات IP للحزمة المراد إرسالها
عنوان FIP:DWORD؛
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// المخزن المؤقت لرد صدى ICMP
حجم: DWORD؛
MyString:string;
FTimeOut:DWORD;
حجم المخزن المؤقت: DWORD؛
يبدأ
إذا كان PingEdit.Text <> 'ثم
يبدأ
FIPAddress := inet_addr(PChar(PingEdit.Text));
حجم := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
fillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'مرحبا أيها العالم';
pReqData := PChar(MyString);
fillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
إذا pReqData^ = pIPE^.Options.OptionsData^ إذن
يبدأ
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
نهاية؛
FreeMem(pRevData);
FreeMem(pIPE);
نهاية
نهاية؛
من خلال البرمجة المذكورة أعلاه، أدركنا تشغيل الواجهة لوظيفة Ping. في الواقع، هناك العديد من وظائف بروتوكول ICMP، والتي يمكن تحقيقها من خلال استدعاءات الوظائف إلى Icmp.dll.