【问题标题】:Multiple send, single recv多次发送,一次接收
【发布时间】:2014-03-09 05:33:34
【问题描述】:

我对 unix 编程中的 send 和 recv 机制感到困惑: 如果我使用多次发送将一些字符串发送到recv,然后使用缓冲区足够大的recv,有时我会得到一个由send的所有字符串组成的整个字符串,但有时我只得到其中的一部分.为什么会有所不同?我该如何应对?

【问题讨论】:

  • 您想如何处理这个问题?为什么要使用“多次发送”?就目前而言,这个问题既不清楚又非常广泛。
  • 理想情况下,recv() 的数量应该与 send() 的数量一样多。你不应该混淆它。
  • 收回我的评论,行为不可预测,需要在代码中处理。检查我的答案。
  • @dvnrrs 我只是对机制很好奇并尝试了。

标签: c unix


【解决方案1】:

因为距离、时间和中间发生的事情。

假设您正在谈论 tcp,根据各种设置,您可能会在数据包发出之前执行 5 sends。 Tcp 不知道您的“字符串”是什么。它所看到的只是一个来来去去的字节流。

也许你的一半字符串在一个数据包中到达,而你的recv 在一次读取中获取这些字节。但是字符串的后半部分在第二个数据包中,该数据包丢失并被某些机器沿路由重新传输或分段为 2 个数据包。你没有办法知道。

因此,您构建应用程序以了解自己的消息边界并相应地进行计划。 对应用程序有意义的消息必须由某些内容(例如换行符)分隔或以表示消息中有多少字节的长度字节作为前缀。直到你得到那个字节数并且可以对完整的消息做一些有意义的事情。

【讨论】:

  • 这是一个不错的答案。强调 TCP 是一个面向流的协议这一关键可能会有所帮助。在使用 TCP 时,您不得考虑数据包。而是考虑同质的字节流。如果您以这种方式思考和编码,您应该不会遇到任何麻烦。
【解决方案2】:

这完全取决于需要多少个 TCP 数据包才能适合您的消息。因此,这里没有定义行为,您需要在代码中处理它,如本文所述:c++ posix sockets recv functionality

【讨论】: