设置connect超时时间

2019-04-14 18:29发布

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." <