c++ - 用 recv() 接收部分数据,这可能吗?

标签 c++ sockets winsock recv

我在 winsock 中使用非阻塞套接字,我想知道我是否可以部分接收数据?

我的数据包包含一个“长度”字,我必须先读取它,然后根据“长度”读取整个数据包。

实际上这个问题就像“recv() 是如何工作和结束的?”,我可以使用 recv() 直到我获得所有数据吗?

最佳答案

这取决于套接字的类型。如果它是一个数据报套接字,recv 将恰好读取一个完整的数据报。如果是 TCP 套接字:

  • recv 会在返回前读取至少一个字节
  • recv 可以读取多个完整的message

如果你使用的是 TCP,你可能会想做这样的事情:

  • 至少读取组成长度的字节
  • 读取length个字节
  • 您现在有一条完整的消息
  • 冲洗,重复

您可以从 readn function 开始.

关于c++ - 用 recv() 接收部分数据,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10690814/

相关文章:

c++ - 重构函数调用,同时减少结果类定义的代码重复

c++ - gsl::span<T> 和 gsl::span<const T> 重载不明确

javascript - Chrome : Mixed content issue for local IP address 192. 168

sockets - Cloud SQL套接字如何知道要连接的域?

c++ - 使用winsock发送缓冲区后是否可以删除内存?

c - 在 C 中,如何 malloc 和释放一个 SOCKET(已经是一个指针)

c# - 网络编程底层或类抽象?

c++ - 误解了 C++ 中的循环?

c++ - 使用 SIMD 管理将累积(单个)值打包成两个值的清理代码循环的方法是什么?

javascript - 有没有办法在浏览器选项卡之间共享套接字连接