2017-05-09 1 views
-3

VB.netを使用して監視システムを作成しています。私は、デバイスがダウンしている場合は、電子メールを送信し、そのデバイスがオンラインに戻った場合に再度電子メールを送信するようにします。私はPingを使ってデバイスを監視しています。デバイスのIPアドレスは既に保存されており、lvi.SubItems(5).Textに表示されます。pingが失敗した場合に一度だけ電子メールを送信します。

次のコードでは、デバイスのpingが失敗した場合に電子メールが常に送信されます。 pingが失敗した場合、電子メールを1回送信するだけです。問題を解決するのを助けてくれますか?

Private Sub Ping_LV() 
    For Each lvi As ListViewItem In LV_Monitoring.Items 
     Dim p As New Ping 
     AddHandler p.PingCompleted, AddressOf p_PingCompleted 
     p.SendAsync(lvi.SubItems(5).Text, lvi) 
    Next 
End Sub 

Private Sub p_PingCompleted(ByVal sender As Object, ByVal e As System.Net.NetworkInformation.PingCompletedEventArgs) 
    Dim p As Ping = DirectCast(sender, Ping) 
    Dim lvi As ListViewItem = DirectCast(e.UserState, ListViewItem) 

    If e.Reply.Status = IPStatus.Success Then 
     Console.WriteLine("Ping Success") 
     lvi.SubItems(6).Text = "UP" 
     lvi.UseItemStyleForSubItems = False 
     lvi.SubItems(6).ForeColor = Color.White 
     lvi.SubItems(6).BackColor = Color.Green 
    Else 
     Console.WriteLine("Ping Failed") 
     lvi.SubItems(6).Text = "DOWN" 
     lvi.UseItemStyleForSubItems = False 
     lvi.SubItems(6).ForeColor = Color.White 
     lvi.SubItems(6).BackColor = Color.Red 
     Sent_Email() 
    End If 

    RemoveHandler p.PingCompleted, AddressOf p_PingCompleted 
    p.Dispose() 
    LV_Monitoring.Refresh() 

End Sub 

Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick 
    Ping_LV() 
End Sub 

Private Sub Form_Monitoring_Devices_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Timer.Start() 
End Sub 
+1

は商品の現在の 'Text'をテストすることができのみすでに「DOWN」でなければ通知を送信してください。私はおそらくむしろ専用のブール旗を使用したいと思います。おそらくアイテムの 'Tag'に格納することができます。 – jmcilhinney

+0

私はそのことを理解していません。その場合のサンプルコードを表示したいと思いますか? –

答えて

2

簡単な方法は、送信されたメールの状態を変数またはプロパティに保持することです。 最初にpingが失敗し、電子メールが送信されると、変数/プロパティをtrueに設定し、PCが再びオンラインになったときにリセットします。もしあなたがこれを追跡するためにコレクションを好むなら、例えば辞書を使うこともできます。

としては、例えば、要求された:

Dim mailSent As New Dictionary(Of String, Boolean) 
Dim ipList As New List(Of String) From {"192.168.192.1", "192.168.192.110", "192.168.192.105"} 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    For Each ip In ipList 
     Dim p As New Ping 
     AddHandler p.PingCompleted, AddressOf PingCompleted 
     p.SendAsync(ip, ip) 
    Next 
End Sub 

Private Sub PingCompleted(sender As Object, e As PingCompletedEventArgs) 
    Dim p = DirectCast(sender, Ping) 
    Dim ip = DirectCast(e.UserState, String) 

    If e.Reply.Status = IPStatus.Success Then 
     If mailSent.Item(ip) Then 
      mailSent.Item(ip) = False 
     End If 
    Else 
     If Not mailSent.Item(ip) Then 
      Console.WriteLine(ip & " is offline") 
      mailSent.Item(ip) = True 
     Else 
      Console.WriteLine("You know already " & ip & "state") 
     End If 
    End If 
    RemoveHandler p.PingCompleted, AddressOf PingCompleted 
    p.Dispose() 
End Sub 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    For Each ip As String In ipList 
     mailSent.Add(ip, False) 
    Next 
End Sub 

を、あなたはあなたが必要なものを得るためにそれを動作するはずですが:)

+0

このケースのサンプルコードを表示しますか?私はこれをやろうとしたので、Pingが1台のPCまたはIPアドレスで失敗した場合は動作し、pingが失敗すると電子メールが送信されます。しかし、その後2台目のPCがダウンすると、電子メールは送信されません。 –

+0

例が追加されました。必要なものは1:1ではありませんが、できることを理解する必要があります。 –

+0

うわー、私はそれを試して成功した多くの兄弟、ありがとう。 –

関連する問題