文档章节

CExternalIpCheck源码分析

h
 hcyy2012
发布于 2017/05/27 14:25
字数 444
阅读 1
收藏 0

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)分支.
 

© 著作权归作者所有

h
粉丝 0
博文 2
码字总数 606
作品 0
崇明
私信 提问
filecoin技术架构分析系列文章 - 目录

我是杨尉,先河系统CTO,欢迎大加关注的的Github: waynewyang,因为工作需要,在FileCoin开源后,从源码层对filecoin的架构进行了一下分析,整理了一些文章,希望对大家有所帮助。 目录 1 fi...

深入浅出区块链
03/11
0
0
源码之下无秘密 ── 做最好的 Netty 源码分析教程

背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法. 刚开始看源码的时候, 自然是比较痛苦...

永顺
2017/11/29
0
0
Redis 专栏(使用介绍、源码分析、常见问题...)

来源http://blog.csdn.net/yangbodong22011/article/details/78529448 https://github.com/hurley25 https://github.com/hurley25/ANet ANet 基于Redis网络模型的简易网络库,网络模块代码取......

libaineu2004
2017/12/16
0
0
Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密...

小致dad
2018/08/03
0
0
Redux源码分析之bindActionCreators

Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分析之compose Redux源码分析之applyMiddleware bindAct...

淡色的云
2017/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部