การเขียนโปรแกรม Delphi เพื่อใช้การดำเนินการ Ping
จาง ไท่ลี่
ผู้ใช้อินเทอร์เน็ตคุ้นเคยกับคำสั่ง "Ping" ซึ่งเป็นไฟล์ปฏิบัติการภายใต้ DOS โดยทั่วไปจะใช้เพื่อตรวจสอบคุณภาพการเชื่อมต่อเครือข่าย หลักการพื้นฐานคือ การใช้ฟังก์ชันในโปรโตคอล ICMP ในแพ็คเกจโปรโตคอล TCP/ip กล่าวคือ เพื่อส่งคำขอไปยังคอมพิวเตอร์ที่ระบุ และคอมพิวเตอร์ที่ได้รับการร้องขอจะส่งคืนการตอบสนองเพื่อตรวจสอบว่าคอมพิวเตอร์กำลังทำงานอยู่หรือไม่ อินเตอร์เน็ตหรือเพื่อตรวจสอบเครือข่ายว่าการเชื่อมต่อมีเสถียรภาพและเชื่อถือได้หรือไม่? ในระหว่างการดำเนินการโปรแกรม Ping คอมพิวเตอร์ทั้งสองเครื่องใช้ทรัพยากรน้อยมาก ดังนั้นจึงเป็นเครื่องมือที่ใช้งานได้จริงมาก
เราสามารถใช้การดำเนินการ "Ping" ผ่านการเขียนโปรแกรมและปรับปรุงเพื่อให้มีรูปแบบอินเทอร์เฟซ Windows และจอแสดงผลใช้งานง่ายกว่า DOS
ขั้นแรก คำอธิบายสั้น ๆ เกี่ยวกับไดนามิกลิงก์ไลบรารีที่จำเป็นในการเขียนโปรแกรม: ในไดเร็กทอรีระบบของ Windows คุณสามารถค้นหาไฟล์ Icmp.dll ได้ ไลบรารีลิงก์แบบไดนามิกนี้มีฟังก์ชันทั้งหมดของโปรโตคอล ICMP การเรียกไลบรารีลิงก์แบบไดนามิก
ฟังก์ชันการเรียกในแฟ้ม Icmp.dll อธิบายไว้ดังนี้:
1. IcmpCreateFile
เปิดตัวจัดการที่คุณสามารถส่งข้อความสะท้อนการร้องขอ ICMP
2. IcmpCloseHandle
ปิดหมายเลขอ้างอิงที่คุณเปิดผ่านฟังก์ชัน IcmpCreateFile
3. IcmpSendEcho
ส่งคำขอ ICMP ผ่านหมายเลขอ้างอิงที่คุณเปิดและส่งคืนหลังจากการหมดเวลาหรือการรับข้อความตอบกลับ โดยพื้นฐานแล้วพารามิเตอร์จะสอดคล้องกับโครงสร้างเฟรม โปรดดูส่วนโปรแกรมด้านล่าง สำหรับความหมายเฉพาะ คุณสามารถดูหนังสือเกี่ยวกับโปรโตคอล ICMP
หลังจากทำความเข้าใจเบื้องต้นเกี่ยวกับฟังก์ชันทั้งสามข้างต้นแล้ว เราก็สามารถเริ่มการเขียนโปรแกรมได้
ขั้นแรกโปรแกรมของเราควรมีฟังก์ชันพื้นฐานดังแสดงในรูปที่ 1 หลังจากรันแล้ว เมื่อต้องการทำเช่นนี้ ขั้นแรกเราสามารถวางตัวควบคุมที่แสดงในรูปภาพด้านขวาบนในหน้าต่าง Delphi เช่น ปุ่ม กล่องแก้ไข และกล่องแสดงข้อความ
(G72.JPG)
แผนผังการทำงานตามปกติ
จากนั้น WinSocket จะเริ่มทำงานที่จุดเริ่มต้นของโปรแกรม (FormCreate) หน้าที่ของมันคือการประกาศข้อมูลเวอร์ชันที่ใช้และในเวลาเดียวกันก็เรียกไลบรารี Icmp.dll
พิมพ์
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = บันทึกที่อัดแน่น
TTL: ไบต์;
TOS: ไบต์;
ธง: ไบต์;
ตัวเลือกขนาด: ไบต์;
ตัวเลือกข้อมูล: PChar;
จบ;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = บันทึกที่แพ็กแล้ว
ที่อยู่: DWord;
สถานะ: DWORD;
RTT: DWORD;
ขนาดข้อมูล: Word;
สงวนไว้: คำ;
ข้อมูล: ตัวชี้;
ตัวเลือก: TIPOptionInformation;
จบ;
TICmpCreateFile = ฟังก์ชั่น: THandle;
TICmpCloseHandle = ฟังก์ชั่น (IcmpHandle: THandle): บูลีน;
TicmpSendEcho = function(IcmpHandle:THandle;
ที่อยู่ปลายทาง: DWORD;
ขอข้อมูล: ตัวชี้;
ขนาดคำขอ: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: ตัวชี้;
ขนาดตอบกลับ: DWord;
หมดเวลา: DWord
): DWord; stdcall;
TMyPing = คลาส (TForm)
แผง 1: TPanel;
Label1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Button2: T ปุ่ม;
Button3: T ปุ่ม;
สถานะแสดง: TMemo;
ขั้นตอน Button3Click (ผู้ส่ง: TObject);
ขั้นตอน FormCreate (ผู้ส่ง: TObject);
ขั้นตอน ExeBtnClick (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
hICMP: จัดการ;
IcmpCreateFile: TicmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
สาธารณะ
{ประกาศสาธารณะ}
จบ;
ขั้นตอน TMyPing.FormCreate (ผู้ส่ง: TObject);
var
WSAData: TWSAData;
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 (ผู้ส่ง: TObject);
var
IPOpt:TIPOptionInformation;//ตัวเลือก IP สำหรับแพ็กเก็ตที่จะส่ง
ที่อยู่ FIP:DWORD;
pReqData,pRevData:PChar;
ไปป์:PIcmpEchoReply;//บัฟเฟอร์ตอบกลับ ICMP Echo
ขนาด: DWORD;
MyString:สตริง;
FTimeOut:DWORD;
ขนาดบัฟเฟอร์:DWORD;
เริ่ม
ถ้า PingEdit.Text <> ' แล้ว
เริ่ม
FIPAddress := inet_addr(PChar(PingEdit.Text));
ขนาด := 40;
ขนาดบัฟเฟอร์ := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,ขนาดบัฟเฟอร์);
FillChar(pIPE^, ขนาดของ(pIPE^), 0);
ท่อ^.ข้อมูล := pRevData;
MyString := 'สวัสดีชาวโลก';
pReqData := PChar(MyString);
FillChar(IPOpt, ขนาดของ (IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, ความยาว (MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
ถ้า pReqData^ = pIPE^.Options.OptionsData^ แล้ว
เริ่ม
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
จบ;
FreeMem(pRevData);
ฟรีเมม(pIPE);
จบ
จบ;
จากการเขียนโปรแกรมข้างต้น เราได้นำการทำงานของอินเทอร์เฟซของฟังก์ชัน Ping มาใช้ ในความเป็นจริง มีฟังก์ชันมากมายของโปรโตคอล ICMP ซึ่งสามารถรับรู้ได้ผ่านการเรียกฟังก์ชันไปยัง Icmp.dll