读书人

设立connect超时时间

发布时间: 2012-10-23 12:12:22 作者: rapoo

设置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);  // 设为阻塞模式


读书人网 >编程

热点推荐