Delphi ใช้ ICMP เพื่อตรวจสอบว่าโฮสต์ระยะไกลยังมีชีวิตอยู่
2005-03-10 Jlbnet
ในการสื่อสารเครือข่ายมักจำเป็นต้องพิจารณาว่าโฮสต์ระยะไกลยังมีชีวิตอยู่เพื่อกำหนดการดำเนินการที่ดำเนินการในส่วนถัดไปหรือไม่ สามารถนำไปใช้โดยตรงโดยใช้โปรโตคอล ICMP แต่ต้องพิจารณารายละเอียดโปรโตคอลจำนวนมากซึ่งเป็นปัญหาที่จะใช้งานได้มากขึ้น มีฟังก์ชั่นสำเร็จรูปในไลบรารี ICMP ที่มาพร้อมกับ Windows เพียงเติมโครงสร้างข้อมูลที่เกี่ยวข้องก่อนใช้งาน
ต่อไปนี้เป็นโครงสร้างข้อมูลที่จะใช้ โครงสร้างเหล่านี้ MSDN มีการประกาศในรูปแบบ C และรูปแบบของ Delphi ได้รับที่นี่
// โครงสร้างข้อมูลโปรโตคอลที่ใช้
PipoptionInfo = ^TipoptionInfo;
tipoptionInfo = บันทึกที่บรรจุ
TTL: byte; // เวลาชีวิต
TOS: byte; // ประเภทของบริการประเภทคำขอ
Flags: byte; // ลอตเตอรี
ตัวเลือกขนาด: byte; // ความยาวตัวเลือก
ตัวเลือก data: pchar; // ตัวเลือกข้อมูล
จบ;
picmpechoreply = ^ticmpechoreply;
ticmpechoreply = บันทึกข้อมูล // ข้อมูลการส่งคืน ICMP
ที่อยู่: dword; // ที่อยู่ IP
สถานะ: dword; // สถานะ
RTT: DWORD;
DATASIZE: Word; // ความยาวข้อมูล
สงวนไว้: Word; // สำรอง
ข้อมูล: ตัวชี้; // ข้อมูล
ตัวเลือก: TipoptionInfo; // พื้นที่ตัวเลือก
จบ;
// การประกาศฟังก์ชั่นในไลบรารีแบบไดนามิก
TICMPCreateFile = ฟังก์ชั่น: thandle;
TICMPCLOSEHANDLE = ฟังก์ชั่น (ICMPHANDLE: THANDLE): BOOLEAN;
ticmpsendecho = ฟังก์ชั่น (icmphandle: thandle; destinationaddress: dword;
RequestData: ตัวชี้;
ReplyBuffer: Pointer;
// การประกาศตัวแปรที่จะใช้
HICMPDLL, HICMP: Thandle;
WSADATA: TWSADATA;
ICMPCreateFile: TICMPCreateFile;
ICMPCLOSEHANDLE: TICMPCLOSEHANDLE;
ICMPSENDECHO: TICMPSENDECHO;
// DESTIP: ที่อยู่ระยะไกลที่จะตรวจพบคือ 192.168.1.1
ขั้นตอน f_checkonline (DESTIP: String);
วาจา
ipopt: tipoptioninfo; // package ip options
ipaddr: dword;
preqdata, prevdata: pchar;
Pipe: picmpechoreply; // icmp echo ตอบบัฟเฟอร์บัฟเฟอร์
fsize: dword;
MyString: String;
ftimeout: dword;
บัฟเฟอร์: dword;
ฉัน: จำนวนเต็ม;
เริ่ม
hicmpdll: = loadlibrary ('icmp.dll'); // คลิกไลบรารี ICMP แบบไดนามิก
ถ้า hicmpdll <> null แล้ว
เริ่ม
WSASTARTUP ($ 101, WSADATA); // เริ่มต้นสแต็กเครือข่ายโปรโตคอล
@ICMPCreateFile: = getProcAddress (hicmpdll, 'icmpcreatefile'); // โปรดฟังก์ชั่นการส่งออกในไลบรารีแบบไดนามิก
@ICMPCLOSEHANDLE: = getProcAddress (HICMPDLL, 'ICMPCLOSEHANDLE');
@ICMPSENDECHO: = getProcaddress (HICMPDLL, 'ICMPSENDECHO');
hicmp: = icmpcreatefile; // สร้างที่จับ ICMP
ipaddr: = inet_addr (pchar (destip)); // รับที่อยู่ IP ของโฮสต์ระยะไกลที่จะตรวจพบ
fsize: = 40;
บัฟเฟอร์: = sizeof (ticmpechoreply) + fsize;
getMem (prevdata, fsize);
getMem (ท่อบัฟเฟอร์);
Fillchar (ท่อ^, sizeof (pipe^), 0);
ท่อ^.data: = prevdata;
mystring: = 'สวัสดีออนไลน์?'; // สตริงโดยพลการ
preqdata: = pchar (mystring);
Fillchar (ipopt, sizeof (ipopt), 0);
ipopt.ttl: = 64;
ftimeout: = 500; // เวลารอ
i: = icmpsendecho (HICMP, iPaddr, preqdata, ความยาว (mystring), @ipopt, ท่อ, บัฟเฟอร์, ftimeout); // หากมีการส่งคืนค่าส่งคืนระบุจำนวนการตอบกลับที่ได้รับ หาก 0 หมายถึงไม่มีการตอบกลับโฮสต์ไม่สามารถเข้าถึงได้
Freemem (prevdata);
Freemem (ท่อ);
ICMPCLOSEHANDLE (HICMP);
FreeLibrary (HICMPDLL); // release Dynamic Library
WSACLEANUP (); // ทำความสะอาดสแต็กโปรโตคอล
จบ;
จบ;