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是否可写,如果可以写,说明连接完成了。

参考连接:

http://developerweb.net/viewtopic.php?id=3196.&from=groupmessage