socket recv时读取长度传0,会怎么样?
recv 原型:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
man中并没有对 len 参数进行说明;
man中对于 recv 的返回值原文是这样描述的:
These calls return the number of bytes received, or -1 if an error occurred. In the event of an error, errno is set to indicate the error. The return value will be 0 when the peer has performed an orderly shutdown.
正确时,返回读取的字节数;出错时,返回-1;如果连接被关闭,则返回0.
但这个“0”有点费解,如果 recv 的参数就要求读取 0 字节呢(虽然不合理,但 man 并没有说不合法)?此时返回的0应该表示读取了所要求的0个字节,还是连接被关闭了呢?
我不知道,然后就只有请教 StackOverflow 了:
我相信这依赖于具体的实现。如果标准中并没有对此进行说明(我相信是没有的),那么具体的实现可能有以下几种情形:
- 失败,错误码为 EINVAL;
- 读取操作将被挂起;
- 返回 0 并继续;
- 打印一条有趣的消息,并运行游戏 rogue(反正我知道 gcc 就是这么干过的!);
而在我的实现中,我采取了上述第3种方式:返回 0 并继续。但至于是成功读取了0个字节,还是连接已经被关闭,还需要通过 errno 来判断。
好了,无聊扯扯淡,以上就是这么多了~~