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