程序代码:
#define MAXSLEEP 128
int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen) {
int nsec;
/*
* Try to connect with exponential backoff.
*/
for( nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
if( connect(sockfd, addr, alen) == 0) {
/*
Connection accepted
*/
return 0;
}
/*
Delay befor tring again
*/
if(nsec <= MAXSLEEP/2)
sleep(nsec);
}
return (-1);
}
int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen) {
int nsec;
/*
* Try to connect with exponential backoff.
*/
for( nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
if( connect(sockfd, addr, alen) == 0) {
/*
Connection accepted
*/
return 0;
}
/*
Delay befor tring again
*/
if(nsec <= MAXSLEEP/2)
sleep(nsec);
}
return (-1);
}
这个函数使用的是指数补偿(exponential backoff) 的算法。如果调用connect() 失败,
进程就休眠一小段时间然后再尝试, 每循环一次增加每次尝试的延迟。
如果套接字描述符处于非阻塞模式下,那么在连接不能马上建立时,
connect() 将返回 -1, 并且将errno设为 EINPROGRESS
应用程序可以使用poll 或者 select来判断文件描述符何时可写