使用 recv() 接收部分数据是可能的

Receiving part of data with recv(), is that possible?

本文关键字:数据 收部 recv 使用      更新时间:2023-10-16

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

我的数据包包含一个"长度"WORD,我必须首先读取它,然后根据"长度"读取整个数据包。

实际上这个问题就像"recv((

如何工作和结束?",我可以在获得所有数据之前使用recv((吗?

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

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

如果您使用的是 TCP,则可能需要执行以下操作:

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

您可以从readn函数开始。

对于 TCP 套接字:您可以在循环中使用 recv,直到您获得足够的字节。请注意,recv 返回的字节数可能少于您请求的字节数。在这种情况下,请继续通话,直到您收到整条消息。