1. 程式人生 > >設定connect超時時間

設定connect超時時間

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); // 設為阻塞模式