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 Ping(string HostNameOrIP,

  int PingRequestCount)

{

  //Enviamos o número de requisições informadas no

  //método

  for(int i=0; i

  {

    this.Ping(HostNameOrIP);

  }

}

 

public void Ping(string HostNameOrIP)

{

  System.Net.IPAddress ipAddress = null;

  //Tenta converter o Host/IP informado

  try

  {

    ipAddress = System.Net.IPAddress.Parse(

      HostNameOrIP);

  }

  catch

  {

...

Quer ler esse conteúdo completo? Tenha acesso completo