设立connect超时时间

设置connect超时时间

socket编程中,当客户端connect()连接一个服务端时,如果网络或服务端繁忙,connect()函数会迟迟不会返回(阻塞模式下)。这里有个方法,可以设置如果在给定的时间内还没有连接上,就不在连接。

1、设置socket为非阻塞模式

2、connect()连接

3、如果出错,用select()系统调用对其进行超时检测,看在给定的时间内socket是否变得可写

    int fd = socket(PF_INET,SOCK_STREAM,0);
    ...
    int flags = fcntl(fd,F_GETFL,0);
    fcntl(fd,F_SETFL,flags | O_NONBLOCK);
    int n = connect(fd,(struct sockaddr*)&addr,sizeof addr);
    if(n < 0)
    {  // EINPROGRESS表示connect正在尝试连接
        if(errno != EINPROGRESS && errno != EWOULDBLOCK)
            return 1;

        struct timeval tv;
        tv.tv_sec = 10;
        tv.tv_usec = 0;
        fd_set wset;
        FD_ZERO(&wset);
        FD_SET(fd,&wset);
        n = select(fd+1,NULL,&wset,NULL,&tv);
        if(n < 0)
        { // select出错
            perror("select()");
            close(fd);
            return 1;
        }
        else if (0 == n)
        { // 超时
            cerr<< "Timeout." << endl;
            close(fd);
            return 1;
        }
        else
        {  // 连接成功
            cerr << "Connectd." <<endl;
        }
    }

    fcntl(fd,F_SETFL,flags & ~O_NONBLOCK);  // 设为阻塞模式