CExternalIpCheck源码分析

原创
2017/05/27 14:25
阅读数 26

CExternalIpCheck是CServerThread的附属类.通过CServerThread消息循环函数调用CExternalIpCheck中的定时器函数.

CExternalIpCheck主要的作用是为PASV提供外部ip的帮助.它一共有三个选项.
0 ----默认选项  里面只是累加计时变量
1 ----指定ip    专用于暴露于外网的电脑
2 ----通过网页返回ip地址   专用于NAT内部的电脑.通过获取网页返回ip.并解析出ip


先主要针对第三种情况进行分析.
每个30秒进行一次侦测,侦测代码如下:
if (!m_bActive && m_nRetryCount)
    {
        if (m_nElapsedSeconds > 60 && m_nRetryCount < 5)   //失败了5次以内,每一分钟检测一次
        {
            Start();
            return;
        }
        else if (m_nElapsedSeconds > 300 && m_nRetryCount < 10)失败次数大于5次小于10次,5分钟检测一次
        {
            Start();
            return;
        }
        else if (m_nElapsedSeconds > 900 && m_nRetryCount < 20)失败次数大于10次小于20次,15分钟检测一次
        {
            Start();
            return;
        }
        else if (m_nElapsedSeconds > 3600)//大于20次,1个小时检测一次
        {
            Start();
            return;
        }
    }
    else if (m_bActive)
    {
        if (m_nElapsedSeconds > 30)
        {
            m_bActive = FALSE;
            Close();
            m_nRetryCount++;
            m_nElapsedSeconds = 0;
        }
    }
    else
    {
        if (m_nElapsedSeconds > 300 && m_bTriggerUpdateCalled)//如果有数据传输连接失败的情况,5分钟检测一次
            Start();
        else if (m_nElapsedSeconds > 3600)//1个小时检测一次
            Start();
    }
    
m_bActive在onconnect中置位为true.在onrecevice中置位为false.它表示是否连接到web服务器上面.
一般正常流程是服务器启动后,做一次外部ip的探测,如果探测成功,m_nRetryCount置位为0.
此后进入最后的else分支.5分钟后再次检测或者数据传输失败时,就是EndTransfer(2)后,每10秒检测一次ip.

如果在一般的检测流程中失败,那么会进入!m_bActive && m_nRetryCount分支.

除非连接成功,但是却没有返回,会进入else if (m_bActive)分支.
 

展开阅读全文
打赏
0
0 收藏
分享

作者的其它热门文章

加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部