【问题标题】:padding of responses in recv() api在 recv() api 中填充响应
【发布时间】:2012-03-29 20:46:08
【问题描述】:
  1. 在客户端,它总是得到完整的响应,或者有任何机会在一个排序中获得一半响应而在另一种排序中获得剩余一半(例如:取决于我们为 recv() API 定义的缓冲区)。
  2. 是否有机会接收在 recv() API 中填充的两个响应。

【问题讨论】:

    标签: c sockets visual-c++ tcp tcpclient


    【解决方案1】:

    TCP 不保留消息边界。它所暴露的只是一个字节流。因此,您在一侧调用的 send() 可能与另一侧的 recv() 不对应。例如,可能会发生以下情况:

    • A 用 100 字节调用 send(),然后用 100 字节再次调用 send()
    • B 调用 recv() 并获得 200 个字节(参见 Nagle's algorithm

    或者,反过来:

    • A 使用 1 MiB 调用 send()
    • B 调用 recv(),得到 512 KiB,然后再次调用 recv(),得到 512 KiB(接收方或发送方的缓冲区空间不足)。

    关于您的“填充”问题,并不是说您必须检查 recv() 的返回值以查看缓冲区中实际返回的字节数。

    【讨论】:

      【解决方案2】:

      您可以获取任意数量的数据,从零到您请求的大小。始终检查返回值以查看您实际收到了多少数据。

      回答您的问题:您可能得到的不是完整的“响应”,也可能不是完整的“响应”。如果您收到不止一条完整的回复消息,您可能会收到两条、一条半或不止一条。

      【讨论】:

        【解决方案3】:

        你可以这样形成数据块传递给发送:[6 bytes: data size header] [data]

        然后在循环中调用 recv(),每次迭代读取 1 个字节。读取“数据大小标头”(前 6 个字节)并分配所需大小的缓冲区,然后读取其余字节。

        【讨论】:

          猜你喜欢
          • 2012-04-12
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 2013-10-18
          • 1970-01-01
          • 2020-01-26
          相关资源
          最近更新 更多