c-在recv()api中填充响应


  1. 在客户端,它总是得到完整的响应,或者有任何机会在一个排序中得到一半的响应,而在另一个排序(例如:取决于我们为recv()API定义的缓冲区)
  2. 是否有机会接收到recv()API中填充的两个响应

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

  • A用100字节调用send(),然后用100字节再次调用send
  • B调用recv()并获得200字节(参见Nagle的算法)

或者,反过来说:

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

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

您可以获得从零到所需大小的任意数量的数据。始终检查返回值以查看实际收到的数据量。

回答你的问题:你可以得到不到完整的"回答",也可以得到超过完整的"答复"。如果你收到了不止一条完整的回复信息,你可能会收到两条,或者一条半,或者其他不止一条的信息。

您可以形成通过以下方式发送的数据块:[6字节:数据大小头][data]

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

最新更新