Ping 작업을 구현하는 Delphi 프로그래밍
장 타이리
인터넷을 사용해 본 사용자라면 "Ping" 명령에 익숙할 것입니다. DOS에서 실행되는 파일로 일반적으로 네트워크 연결 품질을 확인하는 데 사용됩니다. 기본 원칙은 TCP/ip 프로토콜 패키지에서 ICMP 프로토콜의 기능을 사용하여 지정된 컴퓨터에 요청을 보내고, 요청을 받은 컴퓨터는 해당 컴퓨터가 실행 중인지 확인하는 응답을 반환하는 것입니다. 인터넷에 접속하거나 네트워크를 확인하려면 연결이 안정적이고 신뢰할 수 있나요? Ping 프로그램을 실행하는 동안 두 컴퓨터 모두 리소스를 거의 소비하지 않으므로 매우 실용적인 도구입니다.
프로그래밍을 통해 "Ping" 작업을 구현하고 Windows 인터페이스 스타일을 가지며 디스플레이가 DOS보다 더 직관적이도록 개선할 수 있습니다.
먼저 프로그래밍에 필요한 동적 링크 라이브러리에 대한 간략한 설명: Windows의 시스템 디렉터리에서 Icmp.dll 파일을 찾을 수 있습니다. 이 동적 링크 라이브러리는 ICMP 프로토콜의 모든 기능을 제공합니다. 동적 링크 라이브러리 호출.
Icmp.dll 파일의 호출 기능은 다음과 같습니다.
1. IcmpCreate파일
ICMP 요청 에코 메시지를 보낼 수 있는 핸들을 엽니다.
2. IcmpCloseHandle
IcmpCreateFile 함수를 통해 연 핸들을 닫습니다.
3. IcmpSendEcho
열어둔 핸들을 통해 ICMP 요청을 보내고 시간 초과 또는 응답 메시지 수신 후 반환합니다. 해당 매개변수는 기본적으로 프레임 구조와 일치합니다. 구체적인 의미는 ICMP 프로토콜에 대한 책을 참조하세요.
위의 세 가지 기능에 대한 사전 이해가 끝나면 프로그래밍을 시작할 수 있습니다.
먼저, 우리 프로그램은 실행 후 그림 1에 표시된 기본 기능을 가져야 합니다. 이를 위해 먼저 Delphi 창의 오른쪽 상단 그림에 표시된 버튼, 편집 상자 및 텍스트 표시 상자와 같은 컨트롤을 배치할 수 있습니다.
(G72.JPG)
일상적인 작업의 개략도
그런 다음 프로그램(FormCreate) 시작 부분에서 WinSocket이 초기화됩니다. 그 기능은 사용된 버전 정보를 선언하는 동시에 Icmp.dll 라이브러리를 호출하는 것입니다.
유형
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = 압축된 기록
TTL: 바이트;
TOS: 바이트;
플래그: 바이트;
옵션크기: 바이트;
옵션데이터: PChar;
끝;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = 압축된 레코드
주소: DWord;
상태: DWORD;
RTT: DWORD;
데이터 크기: 워드;
예약됨: 단어;
데이터: 포인터;
옵션: TIPOptionInformation;
끝;
TICmpCreateFile = 함수: THandle;
TICmpCloseHandle = function(IcmpHandle: THandle): 부울;
TicmpSendEcho = 함수(IcmpHandle:THandle;
목적지 주소: DWORD;
RequestData: 포인터;
요청 크기: 단어;
요청옵션: PIPOptionInformation;
ReplyBuffer: 포인터;
응답크기: DWord;
시간 초과: DWord
): DWord;
TMyPing = 클래스(TForm)
패널1: T패널;
라벨1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Button2: T버튼;
Button3: T버튼;
StatusShow: TMemo;
PROcedure Button3Click(Sender: TObject);
절차 FormCreate(보내는 사람: TObject);
절차 ExeBtnClick(Sender: TObject);
사적인
{비공개 선언}
hICMP: THANDLE;
IcmpCreateFile:TIcmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
공공의
{공개 선언}
끝;
절차 TMyPing.FormCreate(Sender: TObject);
var
WSA데이터: TWSA데이터;
hICMPdll: HMODULE;
시작하다
WSA스타트업($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;
pIPE:PIcmpEchoReply;//ICMP 에코 응답 버퍼
F크기: DWORD;
내문자열:문자열;
FTimeOut:DWORD;
버퍼 크기:DWORD;
시작하다
PingEdit.Text <> '이면 다음
시작하다
FIPAddress := inet_addr(PChar(PingEdit.Text));
F크기 := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,버퍼크기);
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, 길이(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에 대한 함수 호출을 통해 실현할 수 있는 많은 기능이 있습니다.