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

时间:2012-05-21 18:45:36

标签: c++ sockets winsock recv

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

如果你正在使用TCP,你可能想要做这样的事情:

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

您可以从readn function开始。

答案 1 :(得分:2)

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