Delphi는 ICMP를 사용하여 원격 호스트가 살아 있는지 감지합니다.
2005-03-10 JLBNET
네트워크 통신에서는 다음 부분에서 수행 된 작업을 결정하기 위해 원격 호스트가 살아 있는지 여부를 결정해야합니다. ICMP 프로토콜을 사용하여 직접 구현할 수 있지만 많은 프로토콜 세부 사항을 고려해야합니다. 이는 구현하기에 더 문제가됩니다. ICMP 라이브러리에는 Windows와 함께 제공되는 기성품 기능이 있으며 사용하기 전에 해당 데이터 구조를 채우십시오.
다음은 사용될 데이터 구조입니다. 이러한 구조 MSDN은 C 형 양식의 선언을 가지고 있으며 Delphi의 형태는 여기에 제공됩니다.
// 사용 된 프로토콜 데이터 구조
pipoptioninfo = ^tipoptioninfo; // IP 헤더 옵션
tipoptioninfo = 포장 레코드
TTL : 바이트; // 생명 시간
TOS : 바이트; // 서비스 유형, 요청 유형
깃발 : 바이트; // 복권
옵션 크기 : 바이트; // 옵션 길이
OptionsData : PCHA; // 옵션 데이터
끝;
picmpechoreply = ^ticmpechoreply;
ticmpechoreply = Packed Record // ICMP 반품 정보
주소 : dword; // IP 주소
상태 : dword; // 상태
RTT : dword;
DataSize : Word; // 데이터 길이
예약 : 단어; // 예비
데이터 : 포인터; // 데이터
옵션 : tipoptioninfo; // 옵션 영역
끝;
// 동적 라이브러리의 함수 선언
ticmpcreatefile = function : stdcall;
ticmpclosehandle = function (icmphandle : thandle);
ticmpsendecho = function (icmphandle : thandle; destinationAddress : dword;
requestData : POINTER;
ReplyBuffer : POINTER; REPLESSIZE : DWORD; DWORD;
// 사용될 변수 선언
hicmpdll, hicmp : thandle;
wsadata : twsadata;
icmpcreatefile : ticmpcreatefile;
ICMPCLOSEHANDLE : TICMPCLOSEHANDLE;
icmpsendecho : ticmpsendecho;
// Destip : 감지 할 원격 주소는 192.168.1.1입니다.
절차 f_checkonline (destip : string);
var
ipopt : tipoptioninfo; // 패키지 IP 옵션
iPaddr : dword;
preqdata, prevdata : pchar;
파이프 : PICMPECHEROPLY; // ICMP ECHO 응답 버퍼
fsize : dword;
mystring : 문자열;
ftimeout : dword;
버퍼 사이즈 : dword;
I : 정수;
시작하다
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;
버퍼 크기 : = 크기 (ticmpechorephely) + fsize;
getmem (prevdata, fsize);
getmem (파이프, 버퍼 크기);
FillChar (파이프^, sizeof (파이프^), 0);
파이프^.data : = prevdata;
mystring : = 'Hi, Online?'; // 임의의 문자열
preqdata : = pchar (mystring);
Fillchar (ipopt, sizeof (ipopt), 0);
ipopt.ttl : = 64;
ftimeout : = 500; // 대기 시간
I : = ICMPSENDECHO (HICMP, iPADDR, PREQDATA, 길이 (MyString), @ipopt, 파이프, 버퍼 크기, Ftimeout); // 반품이 있으면 반환 값은 수신 된 회신 수를 나타냅니다. 0이 답장을하지 않으면 호스트에 도달 할 수 없습니다
프리 메미 (prevdata);
프리 메미 (파이프);
ICMPCloseHandle (HICMP);
Freelibrary (HICMPDLL); // 동적 라이브러리 릴리스
wsacleanup (); // 프로토콜 스택 청소
끝;
끝;