连接套接字上的read()函数可以返回零字节吗?

kum*_*mar 28 sockets linux network-programming tcp runtime-error

我知道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  
    }
Run Code Online (Sandbox Code Playgroud)

如果read()返回零,这段代码就会爆炸,我知道如何修复它.但是read()有可能返回零吗?

Ser*_*kov 51

当TCP连接在一侧关闭时,另一侧的read()返回0字节.

  • 连接关闭时,+1 read()返回零. (11认同)
  • 读取返回-1并且errno设置为ECONNRESET?如果另一方关闭了连接,那实际上是一个错误条件.我们应该考虑将零返回作为错误条件吗? (3认同)
  • 是的,您应该关闭连接的套接字.然而,这不是一个错误. (3认同)
  • @kumar不,您应该将-1视为错误,将0视为正常断开连接,并在任何一种情况下关闭套接字. (3认同)