Array

Implementación de PING sin usar sockets sin procesar

Man using laptop at home

Windows admite un Protocolo de mensajes de control de Internet (ICMP) para determinar si un host en particular está disponible o no.& amp; amp; nbsp; ICMP es un protocolo de capa de red que ofrece control de flujo, mensajes de error, enrutamiento y otros datos entre hosts de Internet. ICMP es utilizado principalmente por los desarrolladores de aplicaciones para un ping de red.

¿Qué es un ping??

Un ping es el proceso de enviar un mensaje de eco a una dirección IP y leer la respuesta para verificar una conexión entre los hosts TCP / IP. Si está escribiendo una nueva aplicación, será mejor que use el soporte de sockets sin procesar Winsock 2, implementado en & amp; amp; nbsp; Indy, por ejemplo.

Video destacado

Sin embargo, tenga en cuenta que para las implementaciones de Windows NT y Windows 2000, los Raw Sockets están sujetos a verificaciones de seguridad y solo son accesibles para los miembros del grupo administrador y amp; apos; s. Icmp.dll proporciona una funcionalidad que permite a los desarrolladores escribir aplicaciones de ping de Internet en sistemas Windows sin el soporte de Winsock 2.& amp; amp; nbsp;

Tenga en cuenta que la función WSAStartup de Winsock 1.1 debe llamarse antes de usar las funciones expuestas por ICMP.DLL. Si no hace esto, la primera llamada a IcmpSendEcho fallará con el error 10091 (WSASYSNOTREADY).

A continuación puede encontrar el código fuente de la unidad Ping & amp; apos; s. Aquí hay dos ejemplos de uso.

Ejemplo 1: Código de fragmento

& lt; pre & gt; usa Ping ;…& amp; # x200B; & lt; br & gt ;
const & lt; / br & gt;
ADP_IP = & amp; apos; 208.185.127.40 & amp; apos ;; (* http://delphi.about.com *) (tixag; & gt
beginIf & lt; / br & gt; Ping.Ping (ADP_IP) luego ShowMessage (& amp; apos; Acerca de la programación de Delphi accesible!& amp; apos;); & lt; br & gt ;
final & lt; / br & gt;
; & lt; / pre & gt ;

Ejemplo 2: Modo de consola y amp; amp; nbsp; Programa Delphi

Nuestro siguiente ejemplo es un programa Delphi en modo consola & amp; amp; nbsp; que utiliza la unidad Ping: & amp; amp; nbsp ;. Here & amp; apos; s & amp; amp; nbsp; the Ping unit & amp; apos; s fuente:

& lt; pre & gt; unidad Ping; & amp; # x200B; & lt; br & gt ;
interfaces & lt; / br & gt;
& lt; br & gt ;
Windows, SysUtils, Clases; & lt; br & gt ;
type & lt; / br & gt;
& lt; br & gt ;
TSunB = registro empaquetado & lt; br & gt ;
s_b1, s_b2, s_b3, s_b4: byte; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
TSunW = registro empaquetado & lt; br & gt ;
s_w1, s_w2: palabra; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
PIPAddr = ^ TIPAddr; & lt; br & gt ;
TIPAddr = record & lt; br & gt ;
caso & lt; / br & gt;
entero de & lt; br & gt ;
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword); & lt; br & gt ;
final & lt; / br & gt;
; IPAddr = TIPAddr; & lt; br & gt ;
función & lt; / br & gt;
IcmpCreateFile: THandle; stdcall ; externo & amp; apos; icmp.dll & amp; ixag; 1
función & lt; / br & gt; IcmpCloseHandle (icmpHandle: THandle): booleano; & lt; br & gt ;
stdcall & lt; / br & gt;
; externo & amp; apos; icmp.dll & amp; apos; & lt; br & gt ;
función & lt; / br & gt;
IcmpSendEcho & lt; br & gt ;
(IcmpHandle: THandle; DestinationAddress: IPAddr; & lt; br & gt ;
RequestData: Puntero; Tamaño de solicitud: Smallint; & lt; br & gt ;
Opciones de solicitud: puntero; & lt; br & gt ;
ReplyBuffer: Puntero; & lt; br & gt ;
Tamaño de respuesta: DWORD; & lt; br & gt ;
Tiempo de espera: DWORD): DWORD; stdcall ; externo & amp; apos; icmp.dll & amp; apos ;; & lt; br & gt ;
función & lt; / br & gt;
Ping (InetAddress: string ): booleano; & lt; br & gt ;
implementaciones & lt; / br & gt;
& lt; br & gt ;
WinSock; & lt; br & gt ;
función & lt; / br & gt;
Fetch ( var AInput: string ; & lt; br & gt ;
const & lt; / br & gt;
ADelim: string = & amp; apos; & amp; apos ;; & lt; br & gt ;
const & lt; / br & gt;
ADelete: Boolean = true) & lt; br & gt ;
: cadena ; & lt; br & gt ;
var & lt; / br & gt;
& lt; br & gt ;
iPos: entero; & lt; br & gt ;
comenzar & lt; br & gt ;
if & lt; / br & gt; & lt; / br & gt;
ADelim = # 0 luego comience & lt; br & gt ;
// AnsiPos no funciona con # 0 & lt; / br & gt;
& lt; br & gt ;
iPos: = Pos (ADelim, AInput); & lt; br & gt ;
terminar de otra manera comenzar & lt; / br & gt;
& lt; br & gt ;
iPos: = Pos (ADelim, AInput); & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
si & lt; / br & gt;
iPos = 0 luego comenzar & lt; br & gt ;
Resultado: = AInput; & lt; br & gt ;
si & lt; / br & gt;
ADelete luego comience & lt; br & gt ;
AInput: = & amp; apos; & amp; apos ;; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
terminar de otra manera comenzar & lt; / br & gt;
& lt; br & gt ;
resultado: = Copia (AInput, 1, iPos – 1); & lt; br & gt ;
si & lt; / br & gt;
ADelete luego comience & lt; br & gt ;
Eliminar (AInput, 1, iPos + Length (ADelim) – 1); & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
procedimiento & lt; / br & gt;
TranslateStringToTInAddr (AIP: cadena ; var AInAddr); & lt; br & gt;
var & lt; / br & gt;
& lt; br & gt ;
phe: PHostEnt; pac: Char; GInitData: TWSAData; & lt; br & gt ;
comenzar & lt; / br & gt;
& lt; br & gt ;
WSAStartup ($ 101, GInitData); & lt; br & gt ;
try & lt; / br & gt;
& lt; br & gt ;
phe: = GetHostByName (PChar (AIP)); & lt; br & gt ;
si & lt; / br & gt;
Asignado (phe) luego comience & lt; br & gt ;
pac: = phe ^ .h_addr_list ^; & lt; br & gt ;
si & lt; / br & gt;
Asignado (pac) entonces & lt; br & gt ;
comenzar & lt; br & gt ;
con & lt; / br & gt; & lt; / br & gt;
TIPAddr (AInAddr) .S_un_b comienzan & lt; br & gt ;
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]); & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
final & lt; br & gt ;
de lo contrario & lt; br & gt ;
comenzar & lt; br & gt ;
subir & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt;
Exception.Create (& amp; apos; Error al obtener IP de HostName & amp; apos;); & lt; br
final & lt; / br & gt;
; & lt; br & gt ;
final & lt; br & gt ;
de lo contrario & lt; br & gt ;
comenzar & lt; br & gt ;
subir & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt;
Exception.Create (& amp; apos; Error al obtener HostName & amp; apos;); & lt; br & gt
final & lt; / br & gt;
; & lt; br & gt ;
excepto & lt; / br & gt;
& lt; br & gt ;
FillChar (AInAddr, SizeOf (AInAddr), # 0); & lt; br & gt ;
final & lt; / br & gt;
; WSACleanup; & lt; br & gt ;
final & lt; / br & gt;
; & lt; br & gt ;
función & lt; / br & gt;
Ping (InetAddress: string ): booleano; & lt; br & gt ;
var & lt; / br & gt;
& lt; br & gt ;
Mango: Mango; & lt; br & gt ;
InAddr: IPAddr; & lt; br & gt ;
DW: DWORD; & lt; br & gt ;
rep: matriz [1..128] de byte; & lt; br & gt ;
comenzar & lt; / br & gt;
& lt; br & gt ;
resultado: = falso; Mango: = IcmpCreateFile; & lt; br & gt ;
si & lt; / br & gt;
Mango = INVALID_HANDLE_VALUE entonces & lt; br & gt ;
Salida; & lt; br & gt ;
TranslateStringToTInAddr (InetAddress, InAddr); & lt; br & gt ;
DW: = IcmpSendEcho (mango, InAddr, nil , 0, nil , @ rep, 128, 0); Resultado: = (DW 0); IcmpClose
final & lt; / br & gt; ; & amp; # x200B; & lt; br & gt ;
final & lt; / br & gt;
.
& lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; & gt; & gt; & gt; & gt; & gt; & gt; & gt;
& amp; # x203A; Informática

Dejar respuesta

Please enter your comment!
Please enter your name here

FOLLOW US

Related Stories