Implementando o PING sem usar soquetes brutos

janelas suporta um protocolo ICMP (Internet Control Message Protocol) para determinar se um host específico está ou não disponível. O ICMP é um protocolo da camada de rede que fornece controle de fluxo, mensagens de erro, roteamento e outros dados entre hosts da Internet. O ICMP é usado principalmente pelos desenvolvedores de aplicativos para executar ping na rede.

O que é um ping?

Um ping é o processo de enviar uma mensagem de eco para um endereço IP e ler a resposta para verificar uma conexão entre Hosts TCP / IP. Se você estiver escrevendo um novo aplicativo, será melhor usar o suporte a soquetes brutos do Winsock 2, implementado em Indy, por exemplo.

Observe, no entanto, que nas implementações do Windows NT e Windows 2000, os Raw Sockets estão sujeitos a verificações de segurança e são acessíveis apenas aos membros do grupo de administradores. O icmp.dll fornece funcionalidade que permite que os desenvolvedores gravem aplicativos de ping da Internet em sistemas Windows sem o suporte ao Winsock 2.

instagram viewer

Observe que a função WSAStartup do Winsock 1.1 deve ser chamada antes do uso das funções expostas pelo ICMP.DLL. Se você não fizer isso, a primeira chamada para IcmpSendEcho falhará com o erro 10091 (WSASYSNOTREADY).

Abaixo, você pode encontrar o código fonte da unidade Ping. Aqui estão dois exemplos de uso.

Exemplo 1: snippet de código

usa Ping; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) então ShowMessage ('Sobre a programação do Delphi acessível!');
fim
;

Exemplo 2: Programa Delphi no Modo Console

Nosso próximo exemplo é um modo de console Programa Delphi que usa a unidade Ping:. Aqui está a fonte da unidade Ping:

unidade Ping;
interfaceuses

Windows, SysUtils, Classes;
tipo

TSunB = registro embalado
s_b1, s_b2, s_b3, s_b4: byte;
fim
;
TSunW = registro embalado
s_w1, s_w2: palavra;
fim
;
PIPAddr = ^ TIPAddr;
TIPAddr = registro
caso
inteiro do
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: palavra longa);
fim
; IPAddr = TIPAddr;
função
IcmpCreateFile: THandle; stdcall; externo 'icmp.dll';
função
IcmpCloseHandle (icmpHandle: THandle): booleano;
stdcall
; externo 'icmp.dll'
função
IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Ponteiro; RequestSize: Smallint;
RequestOptions: ponteiro;
ReplyBuffer: Ponteiro;
ReplySize: DWORD;
Tempo limite: DWORD): DWORD; stdcall; externo 'icmp.dll';
função
Ping (Endereço Inet: corda): boleano;
Implementação

WinSock;
função
Buscar(var AInput: corda;
const
ADelim: corda = ' ';
const
ADelete: Booleano = verdadeiro)
: corda;
var

iPos: Inteiro;
início
E se
ADelim = # 0 então comece
// O AnsiPos não funciona com # 0

iPos: = Pos (ADelim, AInput);
fim mais começar

iPos: = Pos (ADelim, AInput);
fim
;
E se
iPos = 0 então comece
Resultado: = AInput;
E se
ADelete então comece
AInput: = '';
fim
;
fim mais começar

resultado: = Copiar (AInput, 1, iPos - 1);
E se
ADelete então comece
Excluir (AInput, 1, iPos + Comprimento (ADelim) - 1);
fim
;
fim
;
fim
;
procedimento
TranslateStringToTInAddr (AIP: corda; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
início

WSAStartup ($ 101, GInitData);
experimentar

phe: = GetHostByName (PChar (AIP));
E se
Atribuído (phe) então comece
pac: = phe ^ .h_addr_list ^;
E se
Atribuído (pac) então
início
com
TIPAddr (AInAddr) .S_un_b comece
s_b1: = byte (pac [0]); s_b2: = byte (pac [1]); s_b3: = byte (pac [2]); s_b4: = byte (pac [3]);
fim
;
fim
outro
início
levantar
Exceção. Create ('Erro ao obter o IP do HostName');
fim
;
fim
outro
início
levantar
Exceção. Create ('Erro ao obter o HostName');
fim
;
exceto

FillChar (AInAddr, SizeOf (AInAddr), # 0);
fim
; WSACleanup;
fim
;
função
Ping (Endereço Inet: corda): boleano;
var

Alça: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: matriz[1..128] do byte;
início

resultado: = falso; Identificador: = IcmpCreateFile;
E se
Identificador = INVALID_HANDLE_VALUE então
Saída;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (identificador, InAddr, nada, 0, nada, @rep, 128, 0); Resultado: = (DW 0); IcmpCloseHandle (Handle);
fim
;​
fim
.
instagram story viewer