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是否可寫,如果可以寫,說明連接完成了。
 
 
參考連接:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章