socket recv时读取长度传0,会怎么样?

陪她去流浪 桃子 2015年08月31日 阅读次数:1609

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 了:

我相信这依赖于具体的实现。如果标准中并没有对此进行说明(我相信是没有的),那么具体的实现可能有以下几种情形:

  1. 失败,错误码为 EINVAL;
  2. 读取操作将被挂起;
  3. 返回 0 并继续;
  4. 打印一条有趣的消息,并运行游戏 rogue(反正我知道 gcc 就是这么干过的!);

而在我的实现中,我采取了上述第3种方式:返回 0 并继续。但至于是成功读取了0个字节,还是连接已经被关闭,还需要通过 errno 来判断。


好了,无聊扯扯淡,以上就是这么多了~~

外部连接

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:网络编程