2017-05-09 11 views
-3

我使用VB.net創建監控系統。如果設備關閉,我希望系統發送電子郵件,並在設備重新聯機時再次發送電子郵件。我使用Ping來監視設備。設備的IP地址已保存並將顯示在lvi.SubItems(5).Text中。如果ping失敗,請發送一次郵件

使用以下代碼,如果設備ping失敗,則始終發送電子郵件。如果ping失敗,我只想發送一次電子郵件。你能幫我解決這個問題嗎?

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」,則發送通知。我可能寧願使用一個專用的布爾標誌,儘管您可以將其存儲在項目的「標籤」中。 – 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

你想告訴我這個案例的例子代碼嗎?因爲我之前曾嘗試過這樣做,所以如果一臺PC或IP地址上的Ping失敗,它將工作,一旦ping失敗,它將發送一封電子郵件。但如果第二臺個人電腦在此之後關閉,它將不會發送電子郵件。 –

+0

添加示例,它不是1:1所需的內容,但您應該瞭解可以執行的操作。 –

+0

非常感謝很多兄弟,我已經嘗試過並取得成功。 –