c++ - 获取可在套接字中读取的字节数

标签 c++ sockets recv peek

这是我的场景。我有一个正在与服务器通信的 TCP 客户端。服务器和客户端都在本地计算机 (Windows) 上运行。

对话框是这样的:

  1. 客户端向服务器发送数据(请求)
  2. 客户端确实关闭以在套接字上发送
  3. 客户端通过读取响应阻塞
  4. 服务器接收数据、处理并发回响应(一次性,不分成 block )
  5. 服务器关闭套接字发送
  6. 客户端收到响应,并继续处理。

在第 3 步,我使用 recv() 调用来阻止并从套接字读取数据。此时,我想偷看一下有多少字节的数据可用,这样我才能分配这么多内存。 按照设计,已知服务器已经发送了所有数据,并且没有更多的数据需要发送这个请求。 (参见上面的第 5 步)。

我已经尝试过使用 MSG_PEEK 选项的 recv(),但这似乎没有给出可用的字节总数。

有办法找回吗?

提前致谢。

最佳答案

至少在 Windows 上,您可以使用 ioctlsocket()FIONREAD 命令来确定当前可用于 recv()< 的字节数 读取而不阻塞。不过,当您实际调用 recv() 时,可能已经到达了更多字节。

正如@LokiAstari 所说,您应该在循环中调用recv() 直到它返回0 字节以指示套接字已关闭。您不需要知道有多少字节可用,只需每次传递一个固定长度的缓冲区,recv() 将返回实际读取了多少字节。将读取的每个非零长度缓冲区附加到另一个缓冲区,该缓冲区会根据需要增长,直到您收到所有数据,然后在准备就绪时处理第二个缓冲区。

关于c++ - 获取可在套接字中读取的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9108574/

相关文章:

c++ - 从对象中获取项目集合的最佳实践?

javascript - 如何通过套接字事件停止setTimeOut?

java - 在 java 文件(.java)中使用 javascript 设置和读取/检索 cookie

C - 通过套接字发送修改后的字符串

c++ - 来自不同线程的同一个套接字上发送和接收不起作用

sockets - 如果带有 MSG_PEEK 的非阻塞接收成功,那么没有 MSG_PEEK 的后续接收也会成功吗?

c++ - std::binary_function - 调用不匹配?

c++ - 创建一个 Fast Sin() 函数来提高 fps ?快速 sin() 函数?

c++ - 使用 COM 在 Windows 上的本地计算机上进行进程间通信

c - 在 C 中立即(逐个数据包)从套接字接收 TCP 有效负载