这是我的场景。我有一个正在与服务器通信的 TCP 客户端。服务器和客户端都在本地计算机 (Windows) 上运行。
对话框是这样的:
- 客户端向服务器发送数据(请求)
- 客户端确实关闭以在套接字上发送
- 客户端通过读取响应阻塞
- 服务器接收数据、处理并发回响应(一次性,不分成 block )
- 服务器关闭套接字发送
- 客户端收到响应,并继续处理。
在第 3 步,我使用 recv() 调用来阻止并从套接字读取数据。此时,我想偷看一下有多少字节的数据可用,这样我才能分配这么多内存。 按照设计,已知服务器已经发送了所有数据,并且没有更多的数据需要发送这个请求。 (参见上面的第 5 步)。
我已经尝试过使用 MSG_PEEK 选项的 recv(),但这似乎没有给出可用的字节总数。
有办法找回吗?
提前致谢。
最佳答案
至少在 Windows 上,您可以使用 ioctlsocket()
和 FIONREAD
命令来确定当前可用于 recv()< 的字节数
读取而不阻塞。不过,当您实际调用 recv()
时,可能已经到达了更多字节。
正如@LokiAstari 所说,您应该在循环中调用recv()
直到它返回0 字节以指示套接字已关闭。您不需要知道有多少字节可用,只需每次传递一个固定长度的缓冲区,recv()
将返回实际读取了多少字节。将读取的每个非零长度缓冲区附加到另一个缓冲区,该缓冲区会根据需要增长,直到您收到所有数据,然后在准备就绪时处理第二个缓冲区。
关于c++ - 获取可在套接字中读取的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108574/