Programação Delphi para implementar operação Ping
Zhang Taili
Os usuários que utilizam a Internet estão familiarizados com o comando "Ping". É um arquivo executável em DOS. Geralmente é usado para verificar a qualidade da conexão de rede. O princípio básico é utilizar uma função do protocolo ICMP no pacote de protocolo TCP/ip, ou seja, enviar uma solicitação ao computador especificado, e o computador que recebe a solicitação retorna uma resposta para determinar se o computador está rodando em a Internet ou para verificar a rede A conexão é estável e confiável? Durante a execução do programa Ping, ambos os computadores consomem pouquíssimos recursos, por isso é uma ferramenta muito prática.
Podemos implementar a operação “Ping” por meio de programação e melhorá-la para que tenha uma interface estilo Windows e a exibição seja mais intuitiva que a do DOS.
Primeiro, uma breve explicação da biblioteca de vínculo dinâmico necessária na programação: No diretório System do Windows, você pode encontrar o arquivo Icmp.dll. Esta biblioteca de vínculo dinâmico fornece todas as funções do protocolo ICMP. a chamada da biblioteca de vínculo dinâmico.
As funções de chamada no arquivo Icmp.dll são descritas a seguir:
1.IcmpCreateFile
Abre um identificador através do qual você pode enviar mensagens de eco de solicitação ICMP.
2. IcmpCloseHandle
Feche o identificador que você abriu por meio da função ICmpCreateFile.
3. ICmpSendEcho
Envie uma solicitação ICMP através do identificador que você abriu e retorne após o tempo limite ou recepção da mensagem de resposta. Seus parâmetros são basicamente consistentes com sua estrutura de quadro. Consulte a parte do programa abaixo. Para seu significado específico, você pode consultar os livros sobre o protocolo ICMP.
Após uma compreensão preliminar das três funções acima, podemos iniciar a programação.
Primeiro, nosso programa deve ter as funções básicas mostradas na Figura 1 após a execução. Para fazer isso, podemos primeiro colocar os controles mostrados na imagem superior direita da janela do Delphi, como botões, caixas de edição e caixas de exibição de texto.
(G72.JPG)
Diagrama esquemático da operação de rotina
Em seguida, o WinSocket é inicializado no início do programa (FormCreate). Sua função é declarar as informações da versão utilizada e ao mesmo tempo chamar a biblioteca Icmp.dll.
tipo
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = registro compactado
TTL: Bytes;
TOS: Byte;
Sinalizadores: Byte;
OpçõesTamanho: Byte;
OpçõesDados: PChar;
fim;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = registro compactado
Endereço: DWord;
Estado: DWORD;
RTT: DWORD;
Tamanho dos dados: Word;
Reservado: Palavra;
Dados: Ponteiro;
Opções: TIPOptionInformation;
fim;
TICmpCreateFile = função: THandle;
TICmpCloseHandle = função(IcmpHandle: THandle): Boolean;
TicmpSendEcho = function(IcmpHandle:THandle;
Endereço de destino: DWORD;
RequestData: Ponteiro;
Tamanho da solicitação: Palavra;
Opções de solicitação: PIPOptionInformation;
ReplyBuffer: Ponteiro;
Tamanho da resposta: DWord;
Tempo limite: DWord
): DWord;
TMyPing = classe(TForm)
Painel1: TPanel;
Rótulo1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Botão2: Botão T;
Botão3: Botão T;
StatusShow: TMemo;
Procedimento Button3Click(Remetente: TObject);
procedimento FormCreate(Remetente: TObject);
procedimento ExeBtnClick(Remetente: TObject);
privado
{Declarações privadas}
hICMP: TANDLE;
IcmpCreateFile:TIcmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
público
{Declarações públicas}
fim;
procedimento TMyPing.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
começar
WSAStartup($101, WSAData);
// Carrega o material 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('Tempo de retorno dos bytes do endereço IP de destino (milissegundos)');
fim;
A seguir, é hora de realizar o próprio processo de programação da operação Ping conforme mostrado abaixo.
procedimento TMyPing.ExeBtnClick(Remetente: TObject);
var
IPOpt:TIPOptionInformation;//Opções de IP para pacote a ser enviado
Endereço FIPA:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;//buffer de resposta de eco ICMP
Tamanho F: DWORD;
MinhaString:string;
FTimeOut:DWORD;
Tamanho do buffer:DWORD;
começar
se PingEdit.Text <> 'então
começar
Endereço FIPAd := inet_addr(PChar(PingEdit.Text));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Dados := pRevData;
MinhaString := 'Olá, Mundo';
pReqData := PChar(MinhaString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
se pReqData^ = pIPE^.Options.OptionsData^ então
começar
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
fim;
FreeMem(pRevData);
FreeMem(pIPE);
fim
fim;
Através da programação acima, realizamos a operação da interface da função Ping. Na verdade, existem muitas funções do protocolo ICMP, que podem ser realizadas por meio de chamadas de função para Icmp.dll.