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." <<endl;
}
}
fcntl(fd,F_SETFL,flags & ~O_NONBLOCK); // 設爲阻塞模式