套接字ReceiveAsync合并数据包

时间:2011-07-22 13:52:00

标签: c# .net sockets asynchronous tcp

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

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

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

2 个答案:

答案 0 :(得分:7)

这就是TCP的工作原理。 TCP连接是一个双向字节流,你必须这样处理它。从一端进行单次发送可能会导致接收端出现多次读取,反之亦然,多次发送可能会在一次读取中结束,并且传输不会保留应用程序消息边界。

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

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

答案 1 :(得分:-3)

我可能会误会,但这不是Naggle算法的推动吗? 你的套接字应该有一个禁用它的标志。