为什么套接字无限返回-1(错误:104)

时间:2014-01-16 00:41:18

标签: c sockets tcp

我的套接字程序是服务器 - 客户端结构。

奇怪的是,TCP套接字构建时(客户端连接和服务器接受)的可能性很小。

我使用select而不是读取套接字,它将返回-1并且errno为104(由对等方重置连接)。

但是我不发送任何服务器和客户端,正常情况下它应该阻止select函数(我的select函数没有设置超时限制),但read函数返回-1。

为什么会这样?或者我该怎么做可以获得更多细节来调试这个问题?

谢谢大家。

平台:ubuntu 13.04 64bits,gcc编译器

我的代码的最小版本:

服务器:

for(;;)
    {
        rset= allset;
        select(maxfd+1, &rset, NULL, NULL, NULL);

        //read socket
        if( FD_ISSET(fconn[i].fd, &rset) )
        {
            len=read(fconn[i].fd, &tcp_buf.b[4], PACKET_LENGTH);

            //the connection will close
            if( len<0 )
            {
                printf("%s, fconn %s read length:%d, errno:%d(%s), close connection\n", crtTime(), fconn[i].ip, len, errno, strerror(errno) );
                close( fconn[i].fd );
                FD_CLR( fconn[i].fd, &allset );
            }
        }

        //construct new connection
        if( FD_ISSET(forwardSockfd, &rset) )
        {
            clilen= sizeof(cliaddr);
            connfd= accept( forwardSockfd, (struct sockaddr*)&cliaddr, &clilen );
            inet_ntop( AF_INET, &cliaddr.sin_addr, ip, sizeof(ip) );
            client_port= (int)cliaddr.sin_port;

            //set send buffer size
            int sendBuf= SOCKET_BUF_LENGTH;
            setsockopt(connfd, SOL_SOCKET, SO_SNDBUF, &sendBuf, sizeof(sendBuf));

            FD_SET( connfd, &allset );
        }
    }

客户端(我的阅读功能):

int readline(int fd, void* ptr, int len)
{
    int    rtn= len;
    void*  bp= ptr;
    int    rc;
    fd_set fdset;

    FD_ZERO(&fdset);
    FD_SET(fd, &fdset);
    while( len>0 )
    {
        select(fd+1, &fdset, NULL, NULL, NULL);
        rc=read(fd, bp, len);


        if(rc>0)
        {
            bp+= rc;
            len-= rc;
        }

        else
        {
            return rc;
        }
    }

    return rtn;
}

1 个答案:

答案 0 :(得分:5)

  

它将返回-1并且errno为104(由对等方重置连接)

所以连接被对等体重置了。这可能随时发生。这是你无法控制的。正确的操作是关闭套接字并忘记它。连接不再存在。试图再次选择和读取它只是错位的optimisim。