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 = ; // 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是否可写,如果可以写,说明连接完成了。
 
 
参考连接:
posted @ 2020-12-03 14:47  hbg-rohens  阅读(322)  评论(0编辑  收藏  举报