1

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

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

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

4

2 回答 2

4

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

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

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

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

你可以从readn函数开始。

于 2012-05-21T18:48:03.353 回答
2

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

于 2012-05-21T18:49:02.353 回答