2009-09-24 48 views
3

我工作的一個UDP多播庫,並得到關於如何妥善處理鏈路故障問題,斷開/重新連接NIC電纜等C#UDP組播套接字 - 如何處理鏈路故障

在我的測試我具有以下設置:

  • 2服務器SA和SB
  • SA被髮送的UDP多播數據和Sb爲接收組播數據
  • 服務器通過二層思科千兆交換機連接

例如,當我加入sB上的多播組時,我開始從sA的多播數據包接收該套接字上的數據。

現在,當我禁用/拔掉組播接收者sB綁定到的網卡時,我不是 收到任何套接字級別的錯誤(例如在Socket.ReceiveAsync中),我猜測這是UDP的無連接,但我希望我能得到某種通知/例外,因爲多播接收器綁定的IP變得不可用。

無論如何,當我重新啓用該NIC時,儘管發件人仍在發送相同的多播組,但仍未收到更多數據。 我希望內核實際上可以處理在硬件鏈路故障後重新加入組播組,但看起來不是這樣。但是,由於我沒有收到任何套接字級別的錯誤,我真的不知道如何檢測多播接收機的鏈路故障? 是否需要設置某些套接字選項才能使內核重新加入多播組? 我到目前爲止唯一的選擇是監聽System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged事件,並嘗試重新綁定,當我得到一個通知,我必須綁定的本地IP變爲可用時。 其他組播應用程序如何處理該場景?

感謝,

湯姆

回答

0

我不能細講,因爲它是一個公司的祕密我公司協議如何工作,但計劃在心臟您的服務器和客戶端之間週期性地跳動。您的軟件可以在最後一次心臟跳動到來時在內部進行計時,並推斷您是否遭遇過某種網絡/硬件故障。

有很多選項可以用來檢測發生的故障,包括檢查NetworkAddressChanged,但實現心臟跳動會更安全,因爲它是一個通用的解決方案,易於實現並且應該覆蓋幾乎所有案例。

+0

那麼,我的應用程序級別的協議正在發送/消耗心跳,但這並沒有真正幫助我的問題情況。 當接收器應用程序沒有收到任何心跳時,則可能發生多種情況: - 發送方應用程序可能已經死機 - 多交換網絡中的中間交換機可能已經死機 - 交換機過載,等造成過多的數據包丟失 - 等 將在下一條評論中繼續... – TJF 2009-09-29 14:33:42

+0

在這些情況下,接收方無法控制要採取的操作,因爲重新加入多點傳送套接字將導致例外套接字仍然具有有效的綁定,並且如果上述任何問題得到解決,接收方將再次接收數據而無需採取任何行動。 但是,當發生物理鏈路中斷等情況時,糾正措施的作用必須不同,並且從我的測試中,套接字不會自動重新加入多播組。所以,除非我在這裏錯過了一些東西,否則心跳不會真正處理這種情況。 – TJF 2009-09-29 14:34:47

3

我建議你訂閱以下事件:System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

爲了解決當網絡可用處於脫機狀態,設計自己的事件處理程序正常復位的接收器。然後相反,當網絡可用性在線時,重新綁定您的接收器。