瞬时处理connetc() 错误的方法, (指数补偿)
处理瞬时connect() 错误的方法。 这在一个负载很重的服务器上很有可能发生程序代码:
#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); }
这个函数使用的是指数补偿(exponential backoff) 的算法。如果调用connect() 失败,
进程就休眠一小段时间然后再尝试, 每循环一次增加每次尝试的延迟。
如果套接字描述符处于非阻塞模式下,那么在连接不能马上建立时,
connect() 将返回 -1, 并且将errno设为 EINPROGRESS
应用程序可以使用poll 或者 select来判断文件描述符何时可写