背景:異步TCP System.Net.Socket發送(開始/結束髮送)實際上沒有發送任何
我一臺機器上運行的TCP服務器在不同機器上的多個客戶端連接通過TCP,和我使用Wireshark監控網絡流量,以及從我的服務器應用程序中進行記錄,並通過System.Net.Sockets中的System.Diagnostics tracelistener以詳細模式進行記錄。
問題:
提示檢查我的日誌由於一些意想不到的斷開,我看到一些很奇怪的行爲。根據服務器應用程序日誌和System.Diagnostic輸出日誌,我的服務器正在使用開始/結束髮送向客戶端發送一個4字節的數據包。 BeginSend完成,並且EndSend還完成了它說它成功發送了4字節的數據包。
但是,當我查看Wireshark日誌時,該數據包從不出現。我在服務器機器上運行Wireshark,所以應該沒有理由讓數據包出現在我的服務器和跟蹤日誌中,但不應該出現在同一臺機器上的Wireshark日誌中。
此外,在我們的服務器的EndReceive方法中由於發生SocketException而導致發送(〜30秒後)的包被發現後,發生了意外斷開連接。但在從服務器嘗試發送之間的時間內,服務器正在確認從客戶端收到的數據包,因此我知道連接仍處於活動狀態。
有沒有人有類似的經驗,或知道一個錯誤或可能會導致此問題?
我不想認爲這發生在套接字級別,其中TCP說我的數據包發送時,它甚至從來沒有把它發送到電線上,這將意味着我不能依靠TCP作爲可靠的傳輸(這當然是TCP的全部要點)。
樣本記錄
從我的服務器應用程序:
2011-09-07 10:41:38,812 Attempting to send Packet (BeginSend - 4 bytes)
2011-09-07 10:41:38,812 Sent Packet (EndSend - 4 bytes)
從System.Diagnostics程序跟蹤日誌:
System.Net.Sockets Verbose: 0 : [4376] Socket#19699911::BeginSend()
DateTime=2011-09-07T17:41:38.8125000Z
System.Net.Sockets Verbose: 0 : [0980] Data from Socket#19699911::PostCompletion
DateTime=2011-09-07T17:41:38.8125000Z
System.Net.Sockets Verbose: 0 : [0980] 00000000 : 02 04 00 00 : ....
DateTime=2011-09-07T17:41:38.8125000Z
System.Net.Sockets Verbose: 0 : [4376] Socket#19699911::EndSend(OverlappedAsyncResult#44209720)
DateTime=2011-09-07T17:41:38.8125000Z
System.Net.Sockets Verbose: 0 : [4376] Exiting Socket#19699911::EndSend() -> 4#4
DateTime=2011-09-07T17:41:38.8125000Z
System.Net.Sockets Verbose: 0 : [4376] Exiting Socket#19699911::BeginSend() -> OverlappedAsyncResult#44209720
DateTime=2011-09-07T17:41:38.8125000Z
我會貼Wireshark的日誌,太,但本質當時除了來自客戶端的數據包以外,該設備的接口上沒有任何註冊,而c來自服務器的響應確認。
編輯: 根據要求,這裏是發送的代碼(縮短的空間和其他原因)。很簡單,對於任何可能出錯的事情都沒有太多的方法。
在我BeginSend方法:
socket.BeginSend(data, 0, data.Length, SocketFlags.None, EndSend, state);
在我EndSend方法:
bytesSent = socket.EndSend(ar);
注:這不是我第一次圈地,像他們說的......我一直在寫服務器和客戶端過去15年來使用TCP套接字,並且從未經歷過這種情況。
另外,我使用的.NET版本是4.0 ......如果這是任何關係的。
幫助!我在.NET套接字編程中遇到
您可以將相關的客戶端和服務器代碼添加到帖子中嗎?也許代碼中有一個錯誤。 – Jacob
添加了一些代碼...但真的,沒有什麼特別的。這是一個簡單的BeginSend和EndSend ...你可以從MSDN或其他地方獲取任何示例代碼,並重現我所看到的內容。 –
也許我對TCP平臺如何在.NET平臺上工作的理解是錯誤的......當一個Socket.EndSend調用在消息傳遞給接收方並且被接收方確認後會成功返回嗎?或者,當.NET將消息成功發送到網絡接口時,EndSend會成功嗎?如果是後者,一個錯誤的網絡適配器可能會解釋我所看到的。 –