2012-03-29 74 views
0
  1. 在客户端,它总是得到完全响应,或者有一半得到响应的机会,另一半得到另一种响应(例如:取决于缓冲区,我们为recv()API定义)。
  2. 有没有可能在recv()API中接收两个填充响应。

回答

1

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

要回答您的问题:您可以获得比完整的“回复”更少的回报,或者您可以获得比完整的“回复”更多的回复。如果您收到多条完整的回复消息,您可能会得到两个或一个半,或者其他不止一个。

3

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

  • A调用发送(),具有100个字节,然后调用再次发送()有100个字节
  • B调用的recv(),并得到200个字节(见Nagle's algorithm

或者反过来说:

  • A调用send()方法1 MIB
  • B调用的recv(),获得512昆明植物研究所,然后调用的recv()再次,得到512 KiB(缓冲区空间在接收方或发送方都不足)。

关于你提到的“填充”的问题,不是说你检查的recv的返回值(),看看有多少字节,其中居然在缓冲区中返回。

0

可以形成传递给发送这样的数据块:[6个字节:数据大小的头] [数据]

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