【发布时间】:2013-04-26 14:51:11
【问题描述】:
我正在阅读 recv http://linux.die.net/man/2/recv 的手册页,但它并没有真正回答我的问题,所以我希望我能在这里得到一些答案。
我这样称呼recv:
numBytes = ::recv(getSocketId(), pData, nSize, MSG_DONTWAIT);
现在的问题是:
- 当包大于缓冲区时,recv 将读取最多 nSize 个字节并将其放入内存位置。返回值将是 nSize,对吗?在收到所有数据之前,我可以再次调用 recv。
- 当包小于 nSize 时,rcv 将读取尽可能多的可用字节,然后返回值 = 0。或者,recv 会尝试等到实际接收到 nSize 字节?如果我正确理解手册页,我认为情况并非如此(至少我希望如此)。或者 recv 会返回 -1 并且 errno = EAGAIN 或 EWOULDBLOCK?
- 如果recv 返回-1,缓冲区会怎样?在那种情况下它会一直保持不变还是可能已经将部分数据放入其中,但是我永远不知道传输了多少字节,所以我认为情况并非如此,对吧?李>
我想要的是,它读取尽可能多的可用字节,然后返回,给我传输的字节数。在附加层中,我将构建实际的消息,与接收到的消息的碎片程度无关。但是,我不希望服务器卡在接收呼叫上,因为我不知道客户端在做什么,它不应该有效地将服务器挂在一个连接上。
【问题讨论】: