我正在.Net/C# 中编写一些代码以通过以太网与一些工厂设备进行通信。我首先分配一个处理程序:
_TCPConn.BeginReceive(
_StateObject.sBuffer, 0, _StateObject.sBuffer.Length, SocketFlags.None,
new AsyncCallback(Socket_DataArrival), _StateObject);
然后在我的处理程序中,首先,我做一个EndReceive,然后我将数据从套接字的缓冲区传输到我自己的输入缓冲区,以便稍后进行进一步处理,我记录一些东西,然后我做一个BeginReceive重新开始,然后我退出处理程序。所以 ...
....
StateObject stateObject = (StateObject)ar.AsyncState;
int bytesReceived = stateObject.sSocket.EndReceive(ar);
// transfer bytes, log stuff, then reenable receive and leave . . .
_TCPConn.BeginReceive( _StateObject.sBuffer, 0,
_StateObject.sBuffer.Length, SocketFlags.None,
new AsyncCallback(Socket_DataArrival), _StateObject);
return;
这在大多数情况下都可以正常工作,但如果工厂设备发送 2 个数据包并拢,它就会失败。这是一个 Wireshark(网络嗅探器)输出。第一列是以微秒为单位的前一个数据包的时间增量(是的,“微”,而不是“毫秒”)
002397 10.1.1.116 10.1.2.11 TCP .... Len=6
000024 10.1.1.116 10.1.2.11 TCP .... Len=9
当这种情况发生时,第一个数据包似乎消失了——处理程序永远不会被 6 字节数据包调用,只有 9 字节数据包。我知道数据包到达 PC 是因为 Wireshark 显示了它。
但是,如果我们在工厂设备中引入延迟,那么问题就消失了,而不是 24 微秒,而是 10 毫秒。不幸的是,这不是一个解决方案,因为我们无法改变世界各地工厂中安装的大量设备。
有关如何调试和修复此问题的任何建议? 先感谢您!