数据包在定期发送时是堆叠的

Packets Are Stacked When Sent at Regular Intervals

本文关键字:数据包      更新时间:2023-10-16

我正试图以固定的间隔(每秒)通过TCP套接字发送消息。有时不会发送完整的消息,或者将两到四条消息堆叠在一起同时发送。如果返回值是0或者<0,但这些都不是真的。我尝试了一种显而易见的方法,即检查send()的确切返回值,看看发送的字节是少还是多。它只返回我在参数中指定的要发送的数字(如果发送块直到它发送那么多,这是有意义的),即使发送的字节更少。那么,有没有一种准确的方法来说明"发送的数据包大小是否合适?"没有?——做点什么"?

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

TCP没有这样的功能。如何将TCP 分割成数据包取决于内核内网络堆栈。您可以在套接字上设置 TCP_NODELAY 选项来禁用Nagle算法

如果我没理解错的话,有时你发送两个或多个数据包,但它们在远端被当作一个接收。

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

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