VB
.NET - Pingando o servidor periodicamente
![]() |
No artigo de hoje vamos mostrar como pingar um servidor remoto usando a linguagem VB .NET. |
![]() |
Vamos supor que você precisa criar uma aplicação VB .NET que envie um ping a um servidor remoto periodicamente para verificar o estado do servidor.
Neste artigo você vai aprender:
O VB .NET possui o namespace System.Net.NetWorkInterface que fornece acesso a dados de tráfego de rede, informações de endereço de rede e notificação de mudança de endereço para o computador local. O namespace também contém classes que implementam o utilitário Ping. Você pode usar Ping e as classes relacionadas para verificar se um computador está acessível através da rede.
Os métodos de Send e SendAsync da classe Ping enviam um solicitação Internet Control Protocol (ICMP) de eco para um computador remoto e aguarda uma mensagem de resposta de eco ICMP a partir desse computador.
|
O
protocolo de mensagens de controle da Internet (ICMP) é
um padrão TCP/IP necessário definido na RFC 792
"Internet Control Message Protocol (ICMP)"
(disponível apenas em inglês). Com o ICMP, os hosts e
roteadores que usam a comunicação IP podem relatar
erros e trocar informações de status e controle
limitado. Geralmente, as mensagens ICMP são enviadas automaticamente em uma das seguintes situações:
Fonte: http://technet.microsoft.com/pt-br/library/cc758065%28v=ws.10%29.aspx |
A topologia da rede pode determinar se o ping pode conseguir contato com um host remoto. A presença e a configuração dos proxies, a existência de network address translation(NAT) ou firewalls podem impedir que o ping tenha sucesso.
Um ping bem sucedido indica apenas que o host remoto pode ser alcançado na rede, a presença de serviços de nível superior (como um servidor Web) no host remoto não está garantida.
A classe PingReplay fornece a informação sobre o status e dados resultantes de uma operação Send ou SendAsync.
O VB .NET também possui o objeto My.Computer.NetWork que fornece propriedades, eventos e métodos para interagir com a rede à qual o computador está conectado.
O método My.Computer.NetWork.Ping pode ser usado para pingar uma máquina remota conectada a máquina local e retorna um valor boleano indicando se a operação foi realizada com sucesso ou não.
Abaixo temos a sintaxe das sobrecargas disponíveis para este método:
Dim valor1
As Boolean =
My.Computer.Network.Ping(nomeOuEnderecoHost)
Dim valor2 As Boolean = My.Computer.Network.Ping(endereco)
Dim valor3 As Boolean = My.Computer.Network.Ping(nomeOuEnderecoHost,
timeout)
Dim valor4 As Boolean = My.Computer.Network.Ping(endereco,
timeout)
Neste artigo eu vou mostrar duas maneiras bem simples de realizar um ping a um servidor remoto periodicamente.
Recursos usados:
Ping remoto com My.Computer.NetWork
Abra o Microsoft Visual Basic 2010 Express e clique em New Project;
Selecione o template Windows Forms Application e informe o nome PingarPeriodicamente1;
No formulário form1.vb inclua os seguintes controles:
Conforme o leiaute da figura abaixo:
![]() |
A seguir no formulário form1.vb declare as variáveis
'variavel para
controlar o numero de ticks
Private
intervaloTempo As Integer = 0
Private _enderecoHostRemoto As String = "192.18.245.19"
A seguir basta declarar o código no evento Tick do controle Timer - pingTimer conforme abaixo:
Private Sub pingTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pingTimer.Tick
'' verifica o tempo que passou
If intervaloTempo >= 2 Then
' a cada 2 minutos reinicia o contador do tempo
intervaloTempo = 0
' e faz o ping
If My.Computer.Network.Ping(_enderecoHostRemoto) Then
' avisa que pingou
lbPing.Items.Add("Ping no servidor " &_enderecoHostRemoto & " as " & Now.TimeOfDay.ToString())
Else
lbPing.Items.Add("Ping falhou (timeout) : " & Now.TimeOfDay.ToString())
End If
Else
'se não passou 2 minutos incrementa o contador
intervaloTempo += 1
End If
End Sub
|
O código irá ser executado após o intervalo de tempo definido na propriedade Interval do controle Timer.
No código estamos usando My.Computer.Network.Ping(_enderecoHostRemoto) para realizar o ping no endereço definido por _enderecoHostRemoto que no exemplo esta fixo no código.
Executando o projeto iremos obter o seguinte resultado:
![]() |
Tudo bem ! O código funciona mas esta longe de ser um código que 'cheira bem'.
O que eu quero dizer com: "o código não cheira bem" ?
Para responder a essa pergunta temos que fazer outra: "Aonde quero chegar com este código?"
O seu objetivo foi organizar seu código para torná-lo mais fácil de escrever, de entender e de alterar depois ?
Se esse foi o objetivo, fracassamos, pois o código acima não pode ser reutilizado.
Ele pode até servir para um protótipo ou teste rápido que será descartado em seguida.
Ping remoto melhorado
Vamos então tentar melhorar um pouco o nosso código. Para isso vamos incluir outro projeto na solução clicando no menu File -> Add -> New Project;
Selecione o template Windows Forms Application e informe o nome PingarPeriodicamente2;
No formulário form1.vb inclua os seguintes controles:
Conforme o leiaute da figura abaixo:
![]() |
Vamos então criar uma classe que será responsável por realizar o ping no servidor e logar o resultado em um arquivo texto.
No menu Project clique em Add Class e informe o nome Pingador.vb incluindo o código abaixo neste arquivo:
Imports System.IO
Imports System.Net.NetworkInformation
Public Class Pingador
'variavel para controlar o numero de ticks
Private intervaloTempo As Integer = 0
Private _logArquivoWriter As StreamWriter
Private _enderecoHostRemoto As String
Private _ping As Ping
Private WithEvents _pingTimer As New System.Windows.Forms.Timer()
'construtor da classe
Sub New(ByVal enderecoIP As String)
'define o IP
_enderecoHostRemoto = enderecoIP
'define as propriedades e habilita o timer
_pingTimer.Interval = 500
_pingTimer.Enabled = True
_pingTimer.Start()
'cria a instãncia da classe FileStream
Dim fileStream As IO.FileStream = File.Open("logPingServidor_" & Now.Day & Now.Month & Now.Year & ".txt",
FileMode.Append, FileAccess.Write)
Me._logArquivoWriter = New StreamWriter(fileStream)
'cria uma instância da classe Ping
_ping = New Ping()
End Sub
' Este método que é executado quando o timer for disparado
Private Sub TimerEventProcessor(ByVal myObject As Object, ByVal myEventArgs As EventArgs) Handles _pingTimer.Tick
If intervaloTempo >= 2 Then
' a cada 2 minutos resta o o contador do tempo
intervaloTempo = 0
' faz o ping e loga o ping
PingarHostRemoto()
Else
'se não passou 2 minutos incrementa o contador
intervaloTempo += 1
End If
End Sub
Private Sub PingarHostRemoto()
' Exibe a data hora que tentemos pingar no servidor
Me._logArquivoWriter.Write("[")
Me._logArquivoWriter.Write(System.DateTime.Now.ToString())
Me._logArquivoWriter.Write("] ")
Try
Dim reply As PingReply = Me._ping.Send(Me._enderecoHostRemoto, 3000)
If reply.Status = IPStatus.Success Then
Me._logArquivoWriter.Write("Resposta ICMP recebida com sucesso de ")
Me._logArquivoWriter.Write(Me._enderecoHostRemoto)
Me._logArquivoWriter.Write(". Tempo de ida e volta : ")
Me._logArquivoWriter.Write(reply.RoundtripTime)
Me._logArquivoWriter.Write(" milisegundos.")
Else
Me._logArquivoWriter.Write("Resposta ICMP não foi concluída com sucesso de ")
Me._logArquivoWriter.Write(Me._enderecoHostRemoto)
Me._logArquivoWriter.Write("Status da resposta ICMP : ")
Me._logArquivoWriter.Write(reply.Status)
End If
Catch ex As Exception
Me._logArquivoWriter.Write("Foi encontrado um problema durante o ping ")
Me._logArquivoWriter.Write(Me._enderecoHostRemoto)
Me._logArquivoWriter.Write(". Mensagem de Erro: ")
Me._logArquivoWriter.Write(ex.Message)
End Try
Me._logArquivoWriter.WriteLine()
Me._logArquivoWriter.Flush()
End Sub
End Class
|
Neste código instanciando via código um controle Timer e tratando o evento Tick na classe Pingador logando os resultados em um arquivo texto.
O código do formulário onde no evento Click estamos criando uma instância da classe Pingador e disparando assim o ping no servidor remoto para o IP informado:
Imports System.IO
Imports System.Net.NetworkInformation
Public Class Form1
Private Sub btnPing_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPing.Click
Dim pinga As Pingador
If String.IsNullOrEmpty(txtIPServidor.Text) Then
MessageBox.Show("Informe o número IP do servidor remoto. ", "IP", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
lbPing.Items.Add("Iniciando o ping no servidor " & txtIPServidor.Text & Now.Date.ToString())
pinga = New Pingador(txtIPServidor.Text)
End If
End Sub
End Class
|
Abaixo vemos o resultado da execução deste projeto:
![]() |
Podemos melhorar ainda mais o código separando a responsabilidade de logar no arquivo da classe Pingador dessa forma a classe saberia apenas pingar no servidor e outra classe saberia apenas criar o arquivo de log com responsabilidades bem distintas e código independente.
Pegue o projeto completo
aqui:
PingarPeriodicamente.zip
João 8:45
Mas porque eu digo a verdade, não me credes.João 8:46
Quem dentre vós me convence de pecado? Se digo a verdade, por que não me credes?João 8:47
Quem é de Deus ouve as palavras de Deus; por isso vós não as ouvis, porque não sois de Deus.
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB .NET - Pingando o servidor periodicamente - Macoratti
Usando o Controle Winsock II - Macoratti
VB 2005 - Obtendo informações da rede com ... - Macoratti
VB. NET - Network e Remoting - Macoratti
C# - Obtendo o endereço MAC - Macoratti
C# - Compartilhando arquivos - Cliente/Servicor (socket) - Macoratti