VB 2005 - Obtendo informações da rede com NetworkInformation


Você um dia pretendeu obter informações sobre redes em suas aplicações usando o Visual Basic sabe bem que a tarefa não era nada fácil. Ainda bem que a tecnologia evolui e que isso vem tornar a nossa vida mais fácil. A nova versão da plataforma .NET trouxe um o namespace System.Net.NetworkInformation que expõe classes que fornecem acesso ao tráfego de dados na rede, informações sobre endereços , notificação de mudança de endereço para o computador local. O namespace contém também classes que implementam o Ping.

A seguir temos as principais classes do namespace System.Net.NetworkInformation

Classe Descrição
IPAddressInformation Permite obter informação (como endereço IP) sobre o endereço da interface de rede.
IPGlobalProperties Permite obter informação sobre a conectividade da rede (nome do host, dominio, etc.) da máquina local.
IPGlobalStatistics Fornece informação sobre dados estatísticos do IP.
IPInterfaceProperties Permite obter informação sobre interface de rede que suportam os protocolos IPv4 ou IPv6.
NetworkChange Permite detectar alterações na rede como uma mudança na interface do numero IP.
NetworkInterface Representa a interface de rede e fornece informação de configuração e estatística sobre a interface de rede.
PhysicalAddress Representa o endereço MAC para a interface de rede.
Ping Permite determinar se o computador remoto esta acessível na rede.
TcpStatistics Permite obter informação sobre estatística da dados TCP como a conexão TCP atual, o número máximo de conexões permitidas , etc.
UdpStatistics Permite obter informações estatísticas sobre UDP como número de datagramas UD que estão sendo enviados.

Como são dezenas de classes com métodos e propriedades creio que fica mais fácil mostrar aplicações práticas deste namespace em tarefas do dia a dia. Vamos lá...

Vamos começar com a classe Ping que permite a uma aplicação determinar se um computador remoto esta acessível na rede.

A topologia de rede pode determinar se um Ping pode contatar com sucesso um host remoto. A presença e a configuração de proxies, a transação de endereços de rede (NAT) ou firewalls pode impedir o Ping de ser executado com sucesso. Um Ping executado com sucesso indica somente que um host remoto pode ser alcançado na rede mas não indica que serviços de nível mais alto como um servidor web esteja funcionando.

Esta classe fornece funcionalidade parecida com o comando Ping da linha de comando. Os métodos Send e SendAsync enviam uma requisição ICMP para o computador remoto e aguarda por um ICMP de resposta. Para saber detalhes sobre mensagens ICMP veja a RFC 792 em : http://www.ietf.org.

Os seguintes tipos são usados com a classe Ping:

Nome Descrição
IPStatus Define o codigo do status que descreve o efeito de uma requisição de mensagem ICMP.
PingOptions Permite a configuração ou retorno das definições que controlam quanto tempo o pacote de requisição pode ser enviado e se ele pode ser fragmentado.
PingReply Contém o resultado de uma requisição ICMP.
PingException Dispara uma exceção se um erro ocorrer.
PingCompletedEventArgs Contém os dados associados com os eventos PingCompleted , os quais são disparados quando uma chamada SendAsync é completada ou cancelada.
PingCompletedEventHandler Fornece o método callback invocado quando uma chamada SendAsync termina ou é cancelada.

Os métodos Send e SendAsync retornam a resposta em um objeto PingReply. A propriedade PingReply.Status retorna o valor de IPStatus para indicar o resultado da requisição.

Quando enviar uma requisição você precisa definir o computador remoto fornecendo o nome do host , um endereço de IP ou um objeto IPAddress.

A classe Ping oferece métodos síncronos e assíncronos para enviar uma requisição. Vamos a um exemplo de como usar a classe Ping.

Crie um novo projeto no VB 2005 Express Edition chamado pingNet e no formulário padrão inclua uma caixa de texto um controle ListBox e um botão de comando.

Defina os seguintes namespaces para o projeto:

Imports System.Net.NetworkInformation
Imports System.Text

A seguir inclua o seguinte código no evento Click do botão de comando:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIP.Click

lstIP.Items.Clear()

Dim pingSender As Ping = New Ping
Dim opcoes As PingOptions = New PingOptions

opcoes.DontFragment = True

Dim dados As String = "XXXXXXXXXXXXXXXXXXXXXX"
Dim buffer As Byte() = Encoding.ASCII.GetBytes(dados)
Dim timeout As Integer = 120
Dim resposta As PingReply = pingSender.Send(txtIP.Text, timeout, buffer, opcoes)

If resposta.Status = IPStatus.Success Then
lstIP.Items.Add("Endereço : " + resposta.Address.ToString)
lstIP.Items.Add("Tempo de Resposta : " + resposta.RoundtripTime.ToString)
lstIP.Items.Add("Time to live(TTL) : " + resposta.Options.Ttl.ToString)
lstIP.Items.Add("Não fragmentado : " + resposta.Options.DontFragment.ToString)
lstIP.Items.Add("tamanho Buffer : " + resposta.Buffer.Length.ToString)
End If

End Sub

No código acima criamos uma instância da classe Ping e da classe PingOptions. Esta última classe permite que você configure como os pacotes de dados serão transmitidos através da rede. No exemplo definimos a propriedade DontFragment como True para indicar que os dados serão enviados em um único pacote.

Declaramos a variável dados que trata os dados a serem transmitidos; em seguida convertemos os dados em um array de bytes para transmissão através do método Send() da classe Ping().

Usando o método Send() informamos o endereço IP do computador , o timeout em mili-segundos.

O método Ping() retorna um objeto do tipo PingReply o qual você pode examinar para verificar o status da operação. Esta propriedade retorna um enumeração do tipo IPStatus que verificamos para ver se o Ping foi executado com sucesso. A seguir exibimos as propriedades do objeto PingReply no controle ListBox.

A figura abaixo mostra o resultado da execução do projeto:

Vamos incrementar o projeto incluindo um novo botão de comando - Estatisticas - e usar a classe IPGlobalStatistics para retornar estatísticas do IP.

No evento Click deste novo Botão inclua o seguinte código:

Private Sub btnEstatisticas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEstatisticas.Click


Dim propriedades As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties
Dim ipstat As IPGlobalStatistics = propriedades.GetIPv4GlobalStatistics

lstIP.Items.Add("Pacote de dados:")
lstIP.Items.Add("Recebidos : " + ipstat.ReceivedPackets.ToString)
lstIP.Items.Add("Repassados : " + ipstat.ReceivedPacketsForwarded.ToString)
lstIP.Items.Add("Entregues : " + ipstat.ReceivedPacketsDelivered.ToString)
lstIP.Items.Add("Descartado : " + ipstat.ReceivedPacketsDiscarded.ToString)

End Sub

No código acima iniciamos invocando o método estático(não criamos uma instância da classe) GetIPGlobalProperties() da classe IPGlobalProperties. A seguir usamos o método GetIPv4GlobalStatistics() para obter uma referência para o objeto IPGlobalStatistics. Esta classe fornece informação sobre os pacotes recebidos que foram entregues, repassados e descartados.

Na figura a seguir temos o resultado da execução deste código:

A classe NetworkChange é muito legal através dela podemos obter informações de alteração na interface de rede exibindo o novo estado da conexão.(Ex: ligar/desligar o cabo ethernet). Esta classe possui os eventos estáticos NetWorkAvaliabilityChanged e NetworAddressChanged que permitem obter informações de alterações do estado da rede.

O evento NetWorkAvaliabilityChanged é disparado quando a disponibilidade da classe é alterada. Para ter um objeto NetworkChange chamando um método que trata o evento quando o evento NetWorkAvaliabilityChanged ocorre você precisa associar o método com um delegate NetworkAvailabilityChangedEventHandler e incluir este delegate para o evento.

Inclua um novo botão de comando - Verificando a Rede - e no evento Click deste Botão digite o código a seguir:

Private Sub btnVerificaRede_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerificaRede.Click
   AddHandler NetworkChange.NetworkAddressChanged, AddressOf AddressChangedCallback
End Sub

A seguir defina a rotina AddressChangedCallback:

Private Sub AddressChangedCallback(ByVal sender As Object, ByVal e As EventArgs)

Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
Dim n As NetworkInterface
If Not NetworkInterface.GetIsNetworkAvailable() Then
lstIP.Items.Add("Ocorreu perda de conexão.")
Else
lstIP.Items.Add("A rede esta conectada.")
End If

For Each n In adapters
lstIP.Items.Add(n.Name + " - " + n.OperationalStatus)
Next n
End Sub

Até o próximo artigo VB.NET.

referências:

http://msdn2.microsoft.com/en-us/library/htd05whh.aspx


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti