4

我正在.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 毫秒。不幸的是,这不是一个解决方案,因为我们无法改变世界各地工厂中安装的大量设备。

有关如何调试和修复此问题的任何建议? 先感谢您!

4

1 回答 1

0

你为什么要做 EndReceive(ar) 你应该继续接收。分别处理收到的数据包。你不必停止接收。

于 2013-04-24T12:43:43.690 回答