linux connect非阻塞
默认情况下,socket通信中,client用connect来连接server端时是阻塞的。这回导致程序会阻塞在此。
可以改用异步机制。方法如下:
1)设置socket为非阻塞。
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
2)设置connect为异步
int err = -1, ret = -1, res = -1;
ret = connect(fd, (struct sockaddr*) &servaddr, sizeof(struct sockaddr_in));
if (ret < 0) {
if(errno != EINPROGRESS) {
return -1;
} else { //连接正在建立
struct timeval tm;
tm.tv_sec = 3; // 3s
tm.tv_usec = 0;
fd_set fset;
FD_ZERO(&fset);
FD_SET(fd, &fset);
res = select(fd+1, NULL, &fset, NULL, &tm);
if(res <= 0) {
return -1;
} else {
if(FD_ISSET(fd, &fset)) {
socklen_t len = sizeof(int);
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len ) < 0) { //两种错误处理方式
return -1;
}
if(err) {
errno = err;
return -1;
}
return 0;
} else {
return -1;
}
}
}
} else {
return ret;
}
当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中。
后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了。
参考连接: