套接字ReceiveAsync合并数据包

我打算通过套接字接收数据包,但由于它们是从发送方以高频率发送的,因此它们中的一些被打包成单个byte数组。 然后SocketAsyncEventArgs.Buffer保存多个数据包,即使它们是单独发送的(使用wiresharkvalidation)。

我已经尝试对传入的数据包进行排队并异步处理它们,但我仍然得到相同的结果。

这种行为可能是什么原因?

这就是TCP的工作原理。 TCP连接是双向字节流 ,您必须将其视为这样。 从一端单个发送可能导致接收端的多次读取,反之亦然,多次发送可能最终在一次读取中,并且传输不保留应用程序消息边界。

您必须缓冲输入,直到您知道有完整的应用程序消息。 常见的方法是:

  • 固定长度的消息,
  • 消息前面的预先挂起的长度,
  • 使用特殊的“消息结束”分隔符分隔流。

我可能会误会,但这不是纳格尔算法的开头吗? 你的套接字应该有一个禁用它的标志。