注册 登录
编程论坛 Linux系统管理

瞬时处理connetc() 错误的方法, (指数补偿)

madfrogme 发布于 2012-08-24 14:48, 5220 次点击
处理瞬时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来判断文件描述符何时可写
0 回复
1