【问题标题】:understanding socket recv behaviour了解套接字接收行为
【发布时间】:2013-04-26 14:51:11
【问题描述】:

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

我这样称呼recv:

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

现在的问题是:

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

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

【问题讨论】:

    标签: sockets unix


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

    正确。

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

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

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

    没有。

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

    正确。

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

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

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

    什么都没有。

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

    是的。

    或者是不是已经放入了部分数据

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

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

    没错。

    【讨论】:

    • 谢谢,这很有帮助,因为从联机帮助页中我不太确定缓冲区的状态和所涉及的返回码。
    猜你喜欢
    • 2015-02-21
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2012-08-01
    • 2012-03-08
    • 2023-03-30
    相关资源
    最近更新 更多