Clique aqui para ler todos os artigos desta edição
PING
Crie um aplicativo de PING para Smartphones
Recentemente tive a necessidade de verificar o status de alguns serviços e servidores que utilizo, e como possuo um Smartphone com Windows Mobile e não dispunha de ponto de acesso à internet em alguns lugares, resolvi desenvolver um aplicativo de PING para meu dispositivo.
Mas o que é PING? É um acrônimo para as palavras Packet Internet Groper e não é só isso, PING também é um substantivo adotado como nome pela marinha americana para descrever o ato da busca de objetos no mar pelos seus submarinos. Administradores de Rede usam muito esse aplicativo para checar disponibilidade de servidores, serviços, estações etc.
A resposta dos pacotes enviados a um Host/IP retorna basicamente o tamanho de bytes enviados para a requisição, tempo de resposta do Host/IP em milissegundos e TTL, que é o número de pontos (routing nodes) que o PING poderá passar antes de ser descartado.
O objetivo desse artigo é trabalharmos com o desenvolvimento de um aplicativo para Smarphones utilizando conexão com a internet, importação de API nativa do Windows e uso de XML para guardarmos informações do aplicativo.
Criando a classe ICMPMobile para execução do PING
Na seção Requisitos temos todos os softwares necessários para desenvolver o exemplo deste artigo. Para iniciar a programação, abra o Visual Studio 2005 e crie um novo projeto, através do menu File>New>Project. Na caixa de diálogo, escolha Visual C#>Smart Device>Windows Mobile 5.0 Smartphones>Device Application com o nome de “SmartPing”.
Para criar a classe que fará todo o processo de tratamento das informações inseridas pelo usuário como requisição, tratamento e formatação da resposta do aplicativo, clique no projeto com o botão direito, escolha Add>Class e adicione uma nova classe com o nome de “IcmpMobile”.
Exclua o construtor criado automaticamente, deixando a classe como na Listagem 1.
Listagem 1. Classe IcmpMobile
namespace SmartPing
{
public class IcmpMobile
{
}
}
Primeiramente vamos declarar as variáveis que serão usadas na classe, suas respectivas propriedades, os eventos e em seguida as importações das API’s necessárias para executarmos os métodos como veremos a diante.
Inicialmente é preciso informar obrigatoriamente o IP ou Host para ser pingado, e como parâmetros opcionais, o tamanho do pacote de requisição e o tempo limite para espera da requisição, conforme declaramos no seguinte código:
private int _requestSIZE;
private int _timeOUT;
Em seguida crie as propriedades para expor essas variáveis (Listagem 2).
Listagem 2. Propriedades da classe
public int requestSIZE
{
get { return _requestSIZE; }
set { _requestSIZE = value; }
}
public int TimeOUT
{
get { return _timeOUT; }
set { _timeOUT = value; }
}
Agora crie o construtor da classe e defina os valores iniciais:
public IcmpMobile()
{
requestSIZE = 32;
TimeOUT = 30000;
}
Para saber se a requisição foi bem sucedida ou o tempo limite do pedido foi esgotado é necessário criar manipuladores e eventos para tratar essas informações. Crie-os conforme a Listagem 3. Os eventos são respectivamente: o de retorno da resposta do PING, o de tempo esgotado (TimeOut) e o de erro.
Listagem 3. Eventos e manipuladores da classe IcmpMobile
public delegate void PingReplyDelegate(object sender,
System.Net.IPAddress ReplyIPAddress, int Bytes,
int Time, int TTL);
public event PingReplyDelegate ReplyReceived;
public delegate void PingTimeOutDelegate(
object sender, System.Net.IPAddress ReplyIPAddress,
int Bytes);
public event PingTimeOutDelegate RequestTimedOut;
public delegate void PingErrorDelegate(object Sender,
string ErrorMessage);
public event PingErrorDelegate PingError;
Até aqui tudo bem, agora é preciso importar a API do Windows que contém os métodos que permitem trabalhar com requisições e resposta a Host/IP sobre o protocolo IPv4. O Assembly que permite isso no Windows é o iphlpapi.dll, que é exatamente um IP HELPER e disponibiliza os métodos IcmpSendEcho, IcmpCreateFile e IcmpCloseHandle.
O primeiro método é o que envia a requisição e recebe a resposta do Host onde um dos parâmetros necessários para a execução desse, é a resposta do IcmpCreateFile que tem a função de abrir um manipulador que permite trabalhar as requisições do Icmp Echo que serão emitidas ao Host/IP informado.
Esse último por sua vez é o responsável por fechar o manipulador, veja na Listagem 4 como é feita a importação e uso desses métodos.
Listagem 4. Importação do Windows IP Helper API
[System.Runtime.InteropServices.DllImport(
"iphlpapi.dll", SetLastError = true)]
internal static extern IntPtr IcmpCreateFile();
[System.Runtime.InteropServices.DllImport(
"iphlpapi.dll", SetLastError = true)]
internal static extern bool IcmpCloseHandle(
IntPtr Handle);
[System.Runtime.InteropServices.DllImport(
"iphlpapi.dll", SetLastError=true)]
internal static extern int IcmpSendEcho(
IntPtr IcmpHandle, Int32 DestinationAddress,
byte[] RequestData, Int16 RequestSize,
IntPtr RequestOptions, byte[] ReplyBuffer,
Int32 ReplySize, Int32 Timeout
);
No código anterior, além da DLL importada, é definida a propriedade SetLastError = true para permitir aos métodos que recebam o código do erro win32 se o mesmo ocorrer. Após entender um pouco sobre o Windows IP Helper API, crie os métodos que serão responsáveis pelo tratamento das informações inseridas pelo usuário e iniciar a execução dos métodos vistos anteriormente (Listagem 5).
Listagem 5. Métodos que tratam, executam e formatam a resposta
public void
int PingRequestCount)
{
//Enviamos o número de requisições informadas no
//método
for(int i=0; i
{
this.Ping(HostNameOrIP);
}
}
public void
{
System.Net.IPAddress ipAddress = null;
//Tenta converter o Host/IP informado
try
{
ipAddress = System.Net.IPAddress.Parse(
HostNameOrIP);
}
catch
{
...