【发布时间】:2012-03-29 20:46:08
【问题描述】:
- 在客户端,它总是得到完整的响应,或者有任何机会在一个排序中获得一半响应而在另一种排序中获得剩余一半(例如:取决于我们为 recv() API 定义的缓冲区)。
- 是否有机会接收在 recv() API 中填充的两个响应。
【问题讨论】:
标签: c sockets visual-c++ tcp tcpclient
【问题讨论】:
标签: c sockets visual-c++ tcp tcpclient
TCP 不保留消息边界。它所暴露的只是一个字节流。因此,您在一侧调用的 send() 可能与另一侧的 recv() 不对应。例如,可能会发生以下情况:
或者,反过来:
关于您的“填充”问题,并不是说您必须检查 recv() 的返回值以查看缓冲区中实际返回的字节数。
【讨论】:
您可以获取任意数量的数据,从零到您请求的大小。始终检查返回值以查看您实际收到了多少数据。
回答您的问题:您可能得到的不是完整的“响应”,也可能不是完整的“响应”。如果您收到不止一条完整的回复消息,您可能会收到两条、一条半或不止一条。
【讨论】:
你可以这样形成数据块传递给发送:[6 bytes: data size header] [data]
然后在循环中调用 recv(),每次迭代读取 1 个字节。读取“数据大小标头”(前 6 个字节)并分配所需大小的缓冲区,然后读取其余字节。
【讨论】: