2017-05-09 2 views
-3

Ich erstelle ein Überwachungssystem mit VB.net. Ich möchte, dass das System eine E-Mail sendet, wenn ein Gerät nicht verfügbar ist, und eine E-Mail erneut senden, wenn dieses Gerät wieder online ist. Ich verwende Ping, um die Geräte zu überwachen. Die IP-Adresse des Geräts ist bereits gespeichert und wird in lvi.SubItems(5).Text angezeigt.E-Mail einmal senden, wenn Ping fehlschlägt

Mit dem folgenden Code wird die E-Mail immer gesendet, wenn der Geräte-Ping fehlschlägt. Ich möchte nur die E-Mail einmal gesendet werden, wenn der Ping fehlschlägt. Können Sie mir helfen, das Problem zu lösen?

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

Sie konnten den gegenwärtigen 'Text' des Elements testen und nur Senden Sie die Benachrichtigung, wenn sie noch nicht "DOWN" ist. Ich würde wahrscheinlich lieber ein dediziertes boolesches Flag verwenden, das Sie vielleicht in dem "Tag" des Elements speichern könnten. – jmcilhinney

+0

Das verstehe ich nicht ganz, möchtest du mir einen Beispielcode für diesen Fall zeigen? –

Antwort

2

Einfache Möglichkeit, nur den Zustand der gesendeten E-Mails in einer Variablen oder Eigenschaft zu halten. Wenn also das erste Mal ein Ping fehlschlägt und eine E-Mail gesendet wird, setzen Sie die Variable/Eigenschaft auf True und wenn Ihr PC wieder online geht, setzen Sie ihn zurück. Sie könnten zum Beispiel auch ein Wörterbuch verwenden, wenn Sie eine Sammlung bevorzugen, um dies zu verfolgen.

Wie gewünscht ein Beispiel:

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 

Das ist ein Beispiel, sollten Sie trainieren zu bekommen, was Sie brauchen :)

+0

Möchten Sie mir den Beispielcode für diesen Fall zeigen? Da ich das vorher versucht habe, funktioniert es, wenn der Ping auf 1 PC oder IP-Adresse fehlschlägt, wird eine E-Mail gesendet, sobald der Ping fehlschlägt. Aber wenn der zweite PC danach ausfällt, wird keine E-Mail gesendet. –

+0

Beispiel hinzugefügt, es ist nicht 1: 1, was Sie brauchen, aber Sie sollten verstehen, was Sie tun könnten. –

+0

Wow, vielen Dank Bruder, ich habe es versucht und es erfolgreich. –

Verwandte Themen