Programación Delphi para implementar la operación Ping
Zhang Taili
Los usuarios que han utilizado Internet están familiarizados con el comando "Ping". Es un archivo ejecutable en DOS que generalmente se utiliza para comprobar la calidad de la conexión de red. El principio básico es utilizar una función en el protocolo ICMP en el paquete de protocolo TCP/ip, es decir, enviar una solicitud a la computadora especificada, y la computadora que recibe la solicitud devuelve una respuesta para determinar si la computadora está funcionando. Internet o para comprobar la red. ¿Es la conexión estable y fiable? Durante la ejecución del programa Ping ambos equipos consumen muy pocos recursos, por lo que es una herramienta muy práctica.
Podemos implementar la operación "Ping" a través de la programación y mejorarla para que tenga un estilo de interfaz de Windows y la visualización sea más intuitiva que DOS.
Primero, una breve explicación de la biblioteca de enlaces dinámicos necesaria en la programación: En el directorio Sistema de Windows, puede encontrar el archivo Icmp.dll. Esta biblioteca de enlaces dinámicos proporciona todas las funciones del protocolo ICMP. Nuestra programación se basa en esto. la llamada de la biblioteca de enlaces dinámicos.
Las funciones de llamada en el archivo Icmp.dll se describen a continuación:
1. IcmpCrearArchivo
Abre un identificador a través del cual puede enviar mensajes de eco de solicitud ICMP.
2. Mango de cierre de Icmp
Cierre el identificador que abrió a través de la función IcmpCreateFile.
3. IcmpEnviarEcho
Envíe una solicitud ICMP a través del identificador que abrió y regrese después del tiempo de espera o de la recepción del mensaje de respuesta. Sus parámetros son básicamente consistentes con su estructura de marco. Consulte la parte del programa a continuación para conocer su significado específico, puede consultar libros sobre el protocolo ICMP.
Después de una comprensión preliminar de las tres funciones anteriores, podemos comenzar a programar.
Primero, nuestro programa debería tener las funciones básicas que se muestran en la Figura 1 después de ejecutarse. Para hacer esto, primero podemos colocar los controles que se muestran en la imagen superior derecha de la ventana de Delphi, como botones, cuadros de edición y cuadros de visualización de texto.
(G72.JPG)
Diagrama esquemático de funcionamiento de rutina.
Luego, WinSocket se inicializa al comienzo del programa (FormCreate). Su función es declarar la información de la versión utilizada y al mismo tiempo llamar a la biblioteca Icmp.dll.
tipo
PIPOptionInformation = ^TIPOptionInformación;
TIPOptionInformation = registro empaquetado
TTL: byte;
TOS: Byte;
Banderas: Byte;
OpcionesTamaño: Byte;
Opciones de datos: PChar;
fin;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = registro empaquetado
Dirección: DWord;
Estado: DWORD;
RTT: DWORD;
Tamaño de datos: Palabra;
Reservado: Palabra;
Datos: puntero;
Opciones: TIPOptionInformation;
fin;
TICmpCreateFile = función: THandle;
TICmpCloseHandle = función (IcmpHandle: THandle): booleano;
TicmpSendEcho = function(IcmpHandle:THandle;
Dirección de destino: DWORD;
Solicitud de datos: puntero;
Tamaño de solicitud: Palabra;
Opciones de solicitud: PIPOptionInformation;
ReplyBuffer: Puntero;
Tamaño de respuesta: DWord;
Tiempo de espera: DWord
): DWord;
TMyPing = clase(TForm)
Panel1: Panel T;
Etiqueta1: TLabel;
PingEditar: TEditar;
ExeBtn: TButton;
Botón2: TBotón;
Botón3: TBotón;
EstadoMostrar: TMemo;
Botón de procedimiento3Click(Remitente: TObject);
procedimiento FormCreate(Remitente: TObject);
procedimiento ExeBtnClick(Remitente: TObject);
privado
{Declaraciones privadas}
hICMP: MANGO;
IcmpCreateFile: TicmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
público
{Declaraciones públicas}
fin;
procedimiento TMyPing.FormCreate(Remitente: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
comenzar
WSAStartup ($101, WSAData);
// Carga el material icmp.dll
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
EstadoShow.Text := ';
StatusShow.Lines.Add('Tiempo de retorno de bytes de dirección IP de destino (milisegundos)');
fin;
A continuación, es hora de llevar a cabo el proceso de programación real de la operación Ping como se muestra a continuación.
procedimiento TMyPing.ExeBtnClick (Remitente: TObject);
var
IPOpt:TIPOptionInformation;//Opciones IP para el paquete a enviar
Dirección FIPA:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;//Búfer de respuesta de eco ICMP
Tamaño F: DWORD;
MiCadena:cadena;
FTimeOut:DWORD;
Tamaño del búfer:DWORD;
comenzar
si PingEdit.Text <> ' entonces
comenzar
Dirección FIPA := inet_addr(PChar(PingEdit.Text));
FTamaño := 40;
Tamaño del búfer := Tamaño de (TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(tubería,Tamaño del búfer);
FillChar(pIPE^, TamañoDe(pIPE^), 0);
tubería^.Datos := pRevData;
MiCadena := 'Hola,Mundo';
pReqData := PChar(MiCadena);
FillChar(IPOpt, Tamaño de(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, dirección FIPA, pReqData, longitud (MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
si pReqData^ = pIPE^.Options.OptionsData^ entonces
comenzar
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
fin;
FreeMem(pRevData);
FreeMem(tubería);
fin
fin;
A través de la programación anterior, hemos implementado la operación de interfaz de la función Ping. De hecho, hay muchas funciones del protocolo ICMP, que se pueden realizar mediante llamadas de función a Icmp.dll.