按常规间隔发送时,数据包会堆叠

时间:2011-08-01 14:55:32

标签: c++ sockets tcp send bsd

我试图定期(每秒)通过TCP套接字发送消息。有时,将不会发送完整的消息,也不会一次堆叠并发送两到四条消息。我有if语句,如果返回值为0或< 0,但那些都不是真的。我尝试了一种明显的方法来检查send()的确切返回值,看看是否发送了更少或更多的字节。它只返回我在要发送的参数中指定的数字(如果发送块直到发送那么多,这是有意义的),即使发送的字节较少也是如此。那么有没有一种准确的方式来说“发送正确大小的数据包?不是吗? - 做点什么”?

4 个答案:

答案 0 :(得分:3)

TCP提供可靠的字节,没有消息边界。如果您需要知道消息的长度,您必须将其构建到协议中,例如:发送带有2字节标头的每条消息,指定消息长度。

答案 1 :(得分:2)

TCP没有这样的设施。内核网络堆栈如何将TCP stream 分割成数据包。话虽如此,您可以在套接字上设置TCP_NODELAY选项以禁用Nagle algorithm

答案 2 :(得分:1)

如果我理解你的话,有时你发送两个或更多的数据包,它们会在远端收到。

这是TCP / IP的本质。您不能保证数据包将以不同的方式到达,只是它们将按顺序可靠地到达。

答案 3 :(得分:1)

不确定您正在使用的平台或使用的语法(流,FILE对象或文件描述符;某些代码会澄清这一点)但您可能需要在执行后进行明确的flush操作你编写每个消息来强制内核。我通常使用C风格的文件描述符,通常在描述符上调用fflush就可以使我排队的任何内容立即生效。