【发布时间】:2012-02-02 07:26:49
【问题描述】:
这是我的场景。我有一个与服务器通信的 TCP 客户端。服务器和客户端都在本地机器(Windows)上运行。
对话框如下:
- 客户端向服务器发送数据(请求)
- 客户端确实关闭了套接字上的发送
- 客户端通过读取响应阻塞
- 服务器接收数据、处理并发回响应(一次性,未分成块)
- 服务器关闭以在套接字上发送
- 客户端收到响应,并继续处理。
在第 3 步,我正在使用 recv() 调用来阻止并从套接字读取数据。此时,我想偷看一下有多少字节的数据可用,这样我就可以分配这么多的内存。 通过设计,知道服务器已经发送了所有数据,并且没有更多数据可以发送这个请求。 (参见上面的第 5 步)。
我已经尝试使用带有 MSG_PEEK 选项的 recv(),但这似乎没有给出可用的字节总数。
有办法找回吗?
提前致谢。
【问题讨论】:
-
仅仅因为服务器已经发送了所有数据,这并不意味着它们会同时到达。仅仅因为 recv() 返回并不意味着你已经得到了一切。您应该继续调用 recv() 直到 in 通过返回 0 表明没有任何剩余
-
我在这里说的是无知,但我怀疑答案是否定的,因为内核在收到所有数据包之前无法知道总字节数。这可能要等到客户提出要求后才会发生。所以你能希望的最好的就是一个下限,这就是 MSG_PEEK 给你的。