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.
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.