2010-03-10 62 views
22

我知道read()是一个阻塞调用,除非我使套接字非阻塞。所以我期望read()调用请求4K数据应该返回一个正值(读取的字节数)或错误-1(可能的连接重置由客户端等)。我的问题是:可以在任何情况下read()返回'0'吗?可以在连接的套接字上读取()函数返回零字节吗?

我处理read()方法是这样的:

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

该代码炸弹如果阅读()返回零,我知道如何解决它。但是read()可能返回零吗?

+0

您是否考虑阅读* man *页面? – EJP 2016-01-25 11:23:04

回答

41

当TCP连接在一端关闭时,read()会在另一端返回0字节。

+3

不应该将读取返回-1并将errno设置为ECONNRESET?这实际上是一个错误条件,如果另一方关闭了连接。我们是否应该考虑返回零也作为错误条件? – kumar 2010-03-10 12:59:47

+6

+1连接关闭时,read()返回零。 – 2010-03-10 13:01:42

+1

@kumar:返回零允许您确定发生有序关闭,而不是真正的错误。 – 2010-03-10 13:03:40

相关问题