TCP:recv()获取ECONNRESET

sus*_*sdu 2 c sockets tcp

我正在尝试使用TCP和标准的socket.h库在linux上实现一个简单的客户端/服务器程序.服务器处理多个客户端,每个客户端可以随时关闭()或关闭()套接字.

在服务器端(使用非阻塞读取):

int nBytes;
if ((nBytes = recv(socket, buffer, BUFFER_SIZE, MSG_DONTWAIT)) == -1)
{
    if (errno != EAGAIN && errno != EWOULDBLOCK)
    {
        //print to log
    }

}
if (nBytes == 0)
{

    //other side closed the connection
}
Run Code Online (Sandbox Code Playgroud)

我得到recv()返回-1并将错误设置为ECONNRESET.如果客户端已关闭,连接不应该recv()返回0?

use*_*421 8

原因很多,包括但不限于:

  • 同伴故意重置连接
  • 对等方关闭了连接,同时他还有待处理的未读数据
  • 您已将数据发送到已由对等方关闭的连接
  • 您有待处理的写入数据,并且TCP重试已超时
  • TCP keepalive检测到丢失的连接.

这是致命错误,您应该在获得它时关闭套接字.

每个客户端可以close()或者shutdown()套接字他想要的任何时间.

不,他不能.往上看.

  • @susdu在<http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm>的官方X/Open文档中提到了这个错误情况:如果出现以下情况,recv()函数将失败:... [ECONNRESET]连接被同伴强行关闭. (2认同)