2011-10-14 75 views
2

在某些計算機上我有當UdpClient.Close()太快一個UdpClient.Send後()稱爲UdpClient將不發送數據的奇效。 我使用.NET 4.0和Wireshark來驗證數據包丟失。C#:打電話時UdpClient不發送數據close()來很快

編碼的基本組成部分是:

UdpClient sender = new UdpClient(); 
sender.Connect(new IPEndPoint(this.ipAddress, this.Port)); 
int bytesSent = sender.Send(data, data.Length); 
sender.Close(); 

Weired是:

  • 在大多數計算機上的數據不會有任何問題發送
  • 沒有異常或其他錯誤,即使沒有數據包被髮送
  • bytesSent永遠等於data.Length
  • 在電腦不發送在調用sender.Close()之前將數據包調入Thread.Sleep(250)將解決問題!

那麼,甚至在UdpClient.Send()報告了正確的字節數之後,什麼可以取消發送數據包呢?爲什麼這隻能在某些機器上顯示?這可能是一些網絡驅動程序,防病毒軟件或類似的行爲?

我也試圖明確設置LingerOptions這應該是不必要的作爲默認是關閉底層套接字之前發送所有待處理的數據。然而,做一個sender.Client.LingerState =新LingerOption時(真,10)(如http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.lingerstate.aspx descibed)我得到

SocketException (0x80004005): An unknown, invalid, or unsupported option 
or level was specified in a getsockopt or setsockopt call. 

任何想法是怎麼回事?

問候, 七

回答

2

OK,這已經無關.NET和我的軟件無論是。 看來,病毒掃描器也掃描完整的網絡流量。而對於發送UDP包,這樣.NET庫函數actially 送包,但掃描儀將其丟棄,如果UdpClient.Close()是在send()方法後立即調用。

所以,有兩個可能的變通現在(這爲我工作)

  1. 調用UdpClient.Close(之前介紹睡一會兒)(約4毫秒就足夠了)
  2. 刪除病毒掃描並嘗試另一個(微軟安全必備不顯示這種效果)
相關問題