我正在尝试定期(每秒)通过 TCP 套接字发送一条消息。有时不会发送完整的消息,或者会堆叠两四条消息并同时发送。如果返回值为 0 或 < 0,我有 if 语句,但这些语句永远不会正确。我尝试了一种明显的方法来检查 send() 的确切返回值,以查看是否发送了更少或更多的字节。它只返回我在要发送的参数中指定的数字(如果发送阻塞直到它发送那么多,这很有意义),即使发送的字节数更少。那么有没有一种准确的方式来表示“发送了正确大小的数据包?没有? - 做点什么”?
问问题
152 次
4 回答
3
TCP 提供可靠的字节流,没有消息边界。如果您需要知道消息的长度,则必须将其构建到协议中,例如:发送每条消息都带有一个指定消息长度的 2 字节标头。
于 2011-08-01T15:05:08.580 回答
2
TCP 没有这样的功能。如何将 TCP流分割成数据包取决于内核网络堆栈。话虽如此,您可以在套接字上设置TCP_NODELAY
选项以禁用Nagle 算法。
于 2011-08-01T14:59:18.280 回答
1
不确定您正在使用什么平台或您正在使用什么语法(流、FILE
对象或文件描述符;一些代码会澄清这一点),但您可能需要flush
在编写每条消息后执行显式操作以强制内核。我通常使用 C 风格的文件描述符,通常调用fflush
描述符就足以使我排队的任何内容立即消失。
于 2011-08-01T15:03:58.377 回答
1
如果我对您的理解正确,有时您会发送两个或更多数据包,并且它们会在远端作为一个接收。
这就是 TCP/IP 的本质。您不能保证数据包会以不同的方式到达,只能保证它们会按顺序可靠地到达。
于 2011-08-01T14:58:58.960 回答