Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的.Net套接字处理程序缺少数据包_C#_.net_Sockets_Tcp - Fatal编程技术网

C# 我的.Net套接字处理程序缺少数据包

C# 我的.Net套接字处理程序缺少数据包,c#,.net,sockets,tcp,C#,.net,Sockets,Tcp,我正在用.Net/C编写一些代码,以便通过以太网与一些工厂设备进行通信。我首先分配一个处理程序: _TCPConn.BeginReceive( _StateObject.sBuffer, 0, _StateObject.sBuffer.Length, SocketFlags.None, new AsyncCallback(Socket_DataArrival), _StateObject); 然后在我的处理程序中,首先,我做一个EndReceive,然后我将数据从套

我正在用.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;
这在大多数情况下都可以正常工作,但如果工厂设备将两个数据包发送到一起,则会失败。这是Wireshark(网络嗅探器)的输出。第一列是前一个数据包的时间增量,单位为微秒(是,“微秒”,而不是“毫秒”)

当这种情况发生时,第一个数据包似乎消失了——处理程序从未被调用过6字节的数据包,只有9字节的数据包。我知道数据包在电脑上,因为Wireshark显示了它

但是如果我们在工厂设备中引入延迟,那么问题就消失了,而不是24微秒,而是10毫秒。不幸的是,这不是一个解决方案,因为世界各地的工厂都有大量的已安装设备,我们无法改变


有没有关于如何调试和修复此问题的建议提前谢谢你

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

您可以发布从套接字读取的代码吗?您可以确认如果两个数据包同时到达,您总共没有接收到15个字节(9+6)。使用套接字的两个单独发送可以在单个处理程序回调中接收。理解如何解析接收到的数据至关重要。有时套接字可以在内部缓冲接收到的数据,因此您只会收到一个回调,其中缓冲区包含两个有效负载(6+9)@Daniel其中一些是专有的,但我可能会对其进行伪装。更大的问题是,这会使原来的帖子更长。如果有需求的话,我可以把它作为一个编辑添加进来——我试图保持原始文章的简洁,不太难阅读。这里有一个概念上的问题。TCP通信模型是一个连续的字节流,而不是“数据包”序列。正是IP将流切割成数据包,应用程序序列化到流中的“数据包”不一定与Wireshark中的内容相关。您能否使用Wireshark检查TCP通信的全部内容,包括ACK数据包?
002397  10.1.1.116  10.1.2.11  TCP  ....  Len=6
000024  10.1.1.116  10.1.2.11  TCP  ....  Len=9