已连接套接字上的read()函数是否可能返回零字节?

37

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

我是这样处理read()的:

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

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

如果read()返回零,这段代码将出错,我知道如何修复它。但是read()可能返回零吗?


1
你考虑过阅读 man 页面吗? - user207421
1个回答

64

当一端关闭TCP连接时,另一端的read()函数将返回0字节。


3
如果另一端关闭连接,read 应该返回 -1 并设置 errno 为 ECONNRESET,这实际上是一个错误条件。我们应该将返回值为零也视为错误条件吗? - kumar
1
@kumar:返回零可以让你确定发生了有序的关闭,而不是真正的错误。 - Richard Pennington
6
是的,你应该关闭连接的套接字。但这不是一个错误。 - user184968
3
不,你应该将-1视为错误,将0视为正常断开连接,并在任何情况下关闭套接字。 - user207421
1
只是补充一下,如果您给read的缓冲区大小为0,则即使套接字未关闭,read也将返回0。 - Itay Bianco
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接