为什么这个阻塞套接字读取返回零并且没有错误?

时间:2012-03-21 14:28:52

标签: c linux sockets io

此代码在Linux上运行:

int r, c;
...
assert(0 == (O_NONBLOCK & fcntl(sockfd, F_GETFL, 0)));
errno = 0;
r = read(sockfd, &c, 1);
if (r == 0 && errno == 0) { 
    printf("What gives?\n");
}
...
从套接字执行读取的

有时会返回零(在r中)并且将errno设置为零(0)。 我遇到什么情况? 除非出现错误,否则我真的想要读取阻止。

2 个答案:

答案 0 :(得分:9)

这意味着客户端已完成发送数据(例如:写了shutdown),并且您已经读取了所有可用数据。

  

返回值

     

成功时,返回读取的字节数      (零表示文件结束),      并且文件位置按此编号前进。

答案 1 :(得分:3)

通常read手册页说:

  

成功时,返回读取的字节数(零表示结束   的文件)

所以0表示您的套接字已关闭。