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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
NET - LINQ a seu dispor - Sintaxe e Operadores - Macoratti ...