背景:
我在一台机器上运行TCP服务器,多个客户端连接到不同的机器上进行TCP通信。我使用Wireshark监视网络流量,同时也通过我的服务器应用程序内部的日志记录和System.Net.Sockets中的System.Diagnostics跟踪侦听器以详细模式来监视网络流量。
问题: 由于一些意外的断开连接,我被提示检查我的日志,发现了一些非常奇怪的行为。根据服务器应用程序日志和System.Diagnostic输出日志,我的服务器正在使用begin/end send向客户端发送4字节数据包。BeginSend完成后,EndSend也完成,表示它成功地发送了4字节数据包。
然而,当我查看Wireshark日志时,该数据包从未出现过。我在服务器机器上运行Wireshark,因此没有理由让数据包在我的服务器和跟踪日志中出现,但是在同一台机器上的Wireshark日志中却没有出现该数据包。
此外,很快就会发生意外的断开连接(约30秒后),这是由于我的服务器的EndReceive方法上发生了SocketException。但是,在服务器尝试发送数据之间的时间内,服务器正在确认从客户端接收到的数据包,因此我知道连接仍然处于活动状态。
有没有人有类似的经历,或者知道可能导致这种情况的错误或其他问题?
我不想认为这是在套接字级别发生的,因为TCP说我的数据包已经发送成功,但它甚至没有到达网络,这意味着我不能依赖TCP作为可靠的传输方式(当然,这就是TCP的全部意义)。
日志样本: 来自我的服务器应用程序:
从System.Diagnostics跟踪日志中:
我也会贴上Wireshark日志,但本质上,在那个时间段内,除了来自客户端的数据包和服务器的相应确认之外,该设备接口上没有任何注册信息。
在我的 EndSend 方法中:
注意:这不是我的第一次尝试,就像他们所说的...我过去15年一直在使用TCP套接字编写服务器和客户端,以前从未遇到过这种情况。
此外,我使用的.NET版本是4.0...如果有任何相关性,请告诉我。
救命啊!
问题: 由于一些意外的断开连接,我被提示检查我的日志,发现了一些非常奇怪的行为。根据服务器应用程序日志和System.Diagnostic输出日志,我的服务器正在使用begin/end send向客户端发送4字节数据包。BeginSend完成后,EndSend也完成,表示它成功地发送了4字节数据包。
然而,当我查看Wireshark日志时,该数据包从未出现过。我在服务器机器上运行Wireshark,因此没有理由让数据包在我的服务器和跟踪日志中出现,但是在同一台机器上的Wireshark日志中却没有出现该数据包。
此外,很快就会发生意外的断开连接(约30秒后),这是由于我的服务器的EndReceive方法上发生了SocketException。但是,在服务器尝试发送数据之间的时间内,服务器正在确认从客户端接收到的数据包,因此我知道连接仍然处于活动状态。
有没有人有类似的经历,或者知道可能导致这种情况的错误或其他问题?
我不想认为这是在套接字级别发生的,因为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日志,但本质上,在那个时间段内,除了来自客户端的数据包和服务器的相应确认之外,该设备接口上没有任何注册信息。
编辑: 根据要求,这是发送代码(由于空间和其他原因而缩短)。非常简单,没有什么可能出错的东西。
在我的BeginSend方法中:
socket.BeginSend(data, 0, data.Length, SocketFlags.None, EndSend, state);
在我的 EndSend 方法中:
bytesSent = socket.EndSend(ar);
注意:这不是我的第一次尝试,就像他们所说的...我过去15年一直在使用TCP套接字编写服务器和客户端,以前从未遇到过这种情况。
此外,我使用的.NET版本是4.0...如果有任何相关性,请告诉我。
救命啊!