1

我正在阅读 recv http://linux.die.net/man/2/recv的手册页,但它并没有真正回答我的问题,所以我希望我能在这里得到一些答案。

我这样称呼recv:

numBytes = ::recv(getSocketId(), pData, nSize, MSG_DONTWAIT);

现在的问题是:

  1. 当包大于缓冲区时,recv 将读取最多 nSize 个字节并将其放入内存位置。返回值将是 nSize,对吗?我可以再次调用recv,直到收到所有数据。
  2. 当包小于 nSize 时,rcv 将读取尽可能多的可用字节,然后返回值 < nSize && >= 0。或者 recv 会尝试等待直到实际接收到 nSize 字节?如果我正确理解手册页,我认为情况并非如此(至少我希望如此)。或者 recv 会返回 -1 并且 errno = EAGAIN 或 EWOULDBLOCK?
  3. 如果 recv 返回 -1 缓冲区会怎样?在那种情况下它会一直保持不变,还是可能已经将部分数据放入其中,但是我永远不会知道传输了多少字节,所以我认为情况并非如此,对吧?

我想要的是,它读取尽可能多的可用字节,然后返回,给我传输的字节数。在附加层中,我将构建实际消息,与接收到的消息的碎片程度无关。但是,我不希望服务器卡在接收呼叫上,因为我不知道客户端在做什么,它不应该有效地将服务器挂在一个连接上。

4

1 回答 1

4
  1. 当包大于缓冲区时,recv 将读取最多 nSize 个字节并将其放入内存位置。返回值将是 nSize,对吗?我可以再次调用recv,直到收到所有数据。

正确的。

  1. 当包小于 nSize 时,rcv 将读取尽可能多的可用字节,然后返回值 < nSize && >= 0。

不完全的。如果有数据,它将返回 > 0,如果对等方已关闭连接,则返回 0,如果有错误,或者没有数据并且您处于非阻塞模式,则返回 -1。

或者 recv 会尝试等到实际收到 nSize 个字节?

不。

如果我正确理解手册页,我认为情况并非如此(至少我希望如此)。

正确的。

或者 recv 会返回 -1 并且 errno = EAGAIN 或 EWOULDBLOCK?

是的,如果您处于非阻塞模式并且没有数据。

  1. 如果 recv 返回 -1 缓冲区会怎样?

没有。

在那种情况下它会一直保持不变吗

是的。

或者可能是已经将部分数据放入其中

不,如果你有任何数据,你会得到它的长度,而不是 -1。

但是我永远不会知道传输了多少字节,所以我认为情况并非如此,对吧?

对。

于 2013-05-02T12:37:51.373 回答