深入分析驴子系列(2)

 

在 BOOL CemuleApp::InitInstance() 函数 的 672行(VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );

) 启动一个定时器 在该定时器的 执行函数( void CALLBACK CemuleDlg::StartupTimer(HWND /*hwnd*/, UINT /*uiMsg*/, UINT /*idEvent*/, DWORD /*dwTime*/)

的 814 行 theApp.emuledlg->OnBnClickedButton2();连接到emule服务器

 

 

CServerSocket 就是一个客户端与服务器会话的类(或者说是服务器类),它连接某一具体服务器 ,处理所有与此服务器有关的事物,比如(具体的)发数据,收数据,连接到来等

在连接到来的函数(void CServerSocket::OnConnect(int nErrorCode))里处理各种情况(是否继续尝试连接)

virtual void OnReceive(int nErrorCode) 函数里处理收到的数据包.

 

由于连接比较复杂,所以专门封装了一个类 CServerConnect 来连接服务器。CServerConnect驱动与多个服务器的连接,停止连接尝试,断开连接 ,对连接后的具体信息的处理(如 连接正确 则发送 登陆消息,错误 则重新连接) 超时检测等

 

此两个类 耦合性 较强,所以分析起来比较麻烦。比较好的情况是 只有导出耦合关系,一个类之引用另一个类

另对两个类相关的有些函数可以分离出来形成一个新的类,这样职责比较单一

 

异常: 对于 CServerConnect类 内部维持一个状态机(connecting 和connected 两种状态)

针对两种情况有不同处理,如为connecting 状态 则客户类 多次启动一个新连接

 

对于 CServerSocket类,连接到来后 也有不同的情况 如果 正常 则发登陆消息,关闭所有的与其它服务器的连接

 如果失败 则 要 CServerConnect 启动一个定时器 开始一个新的连接

尝试连接服务器

第一步:

ConnectToAnyServer(UINT startAt, bool prioSort, bool isAuto, bool bNoCrypt)

在该函数里 首先 停止 所有已经连接 和正在连接中的

如果有静态服务器 则处理

监听套接字启动监听

tryAnotherConnectionRequest();

// 启动连接

正常情况下 在tryAnotherConnectionRequest函数里启动

 ConnectToServer(next_server, true, !m_bTryObfuscated);

该函数真正实现一个与服务器连接,如果正在连接 则在

CuploadQueue ::UploadTimer()函数的 965

if (theApp.serverconnect->IsConnecting()) //如果正在连接则检查是否超时

                   theApp.serverconnect->CheckForTimeout(); //一秒钟以后检查连接是否超时

检查是否连接超时

如果 已经连接进去或者 服务器等待登陆信息 则发送登陆信息

 

当正在连接时,客户端会等待 连接事件发生

void CServerSocket::OnConnect(int nErrorCode)

在该函数里处理各种连接事件,如果正常的话 则发登陆消息 不正常的话 则重新启动与其它服务器连接

 

异常情况 处理函数

void CServerConnect::ConnectionFailed(CServerSocket* sender)

驴子连接服务器的过程写的比较细腻,主要有两个类CServerSocket, CServerConnect 来完成服务器的连接与通讯

 

在 BOOL CemuleApp::InitInstance() 函数 的 672行(VERIFY( (m_hTimer = ::SetTimer(NULL, NULL, 300, StartupTimer)) != NULL );

) 启动一个定时器 在该定时器的 执行函数( void CALLBACK CemuleDlg::StartupTimer(HWND /*hwnd*/, UINT /*uiMsg*/, UINT /*idEvent*/, DWORD /*dwTime*/)

的 814 行 theApp.emuledlg->OnBnClickedButton2();连接到emule服务器

登陆服务器

 

以上基本完成了服务器连接的过程

下一篇文章里我会 把他们通讯的过程写一下,这个比较简单一些。

 

由于时间比较紧张,我是利用中午休息的时间 和晚上下班后的时间来看驴子的代码 和写博客 可能写的不太详细

如果 有不清楚的地方我们可以一块探讨 。。

 

 

 

 

转载于:https://www.cnblogs.com/wangok/archive/2008/12/06/1349167.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python现在时间 命令_Python3 - 时间处理与定时任务

1.计算明天和昨天的日期#! /usr/bin/env python#codingutf-8# 获取今天、昨天和明天的日期# 引入datetime模块import datetime#计算今天的时间today datetime.date.today()#计算昨天的时间yesterday today - datetime.timedelta(days 1)#计算明天的时间tomorrow today dat…

LeetCode 1419. 数青蛙(脑洞题)

1. 题目 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。 由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。 请你返回模拟字符串中所有蛙鸣所需不同青蛙的…

MYSQL性能优化(转)

MySQL 服务器调优 最近帮人维护一个DZ论坛,总结如下几个调优技巧,让 MySQL 服务器飞速运行有 3 种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为:1.替换有问题的硬件。2.对 MySQL 进程的设置进行调优。3.对查询进行优化…

python报IndentationError: unexpected indent的解决方法.

问题描述: python语言对缩进非常敏感,一般都是四个空格 一个tab,但是很多时候我们会忽视这个问题。导致两者混用或者少写空格容易出现这样的问题。问题解决:找到指定代码行,重新书写!下面的with open则是明…

termux配置python安装kali_安卓安装kali linux之Termux

解决安装kali无模组问题步骤1.获取root环境需要下载proot直接在命令行里输入pkg install proot,下完以后输入命令termux-chroot获取root环境2.获取git ,因为需要在github上下载atilo,atilo的作用是atilo是github上的一个开源工具,…

LeetCode 466. 统计重复个数(循环节)

1. 题目 由 n 个连接的字符串 s 组成字符串 S,记作 S [s,n]。例如,["abc",3]“abcabcabc”。 如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,“abc”…

aspnet_regsql

aspnet_regsql 使SQL支持会话状态 aspnet_regsql -S localhost -U sa -P password -ssadd -sstype p 其中:-sstype有三个值:t,p,c(详细说明可使用 aspnet_regsql -? 命令查看) 使数据库支持SQL Server高速缓存禁用功能 aspnet_regsql -S localhost -U …

AcWing之找出数组中重复的数字

题目 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 请找出数组中任意一个重复的数字。 注意:如果某些数字不在 0…

python绘制数字23_Python 画数码数字8

import turtlesize 10line 40# 拿出笔pen turtle.Pen()pen.pensize(size)pen.pencolor("blue")turtle.tracer(False) # 不跟踪动画pen.penup()pen.forward(size)pen.pendown()pen.forward(line)pen.penup()pen.forward(size)pen.pendown()pen.left(90)pen.penup()…

LeetCode 303. 区域和检索 - 数组不可变(前缀和)

1. 题目 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 示例: 给定 nums [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRang…

timer控件的使用

拖拉过去后,双击timer,进入timer2_Tick事件,写入代码后, 改timer属性 interval为1 enabled为true 转载于:https://www.cnblogs.com/zzh1236/archive/2008/12/17/1356435.html

AcWing之找出不改变数组找到重复的数字

题目 给定一个长度为 n1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。请找出数组中任意一个重复的数,但不能修改输入的数组。样例 给定 nums [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。思考题: 如果只能使用 O(1) …

DELPHI之备忘(二)

1. DLL的资源释放问题 EXITPROC//*******************//释放资源//*******************var dllExit: Pointer;procedure MyExit;begin//资源释放 ExitProc : dllExit;end;//******************************//创建资源//******************************begin // 资源创建 Exi…

LeetCode 307. 区域和检索 - 数组可修改(树状数组)

1. 题目 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。 示例: Given nums [1, 3, 5] sumRange(0, 2) -> …

python地理_【Python教程】地理可视化

Matplotlib是Python常用的数据绘制包,其绘图功能强大;而Basemap则是Matplotlib的一个子包,负责地图绘制。本文简单介绍如何利用该程序包绘制风向图。具体操作如下:导入命令1)设置工作环境并导入程序包%cd "F:\\Dropbox\\pyth…

部署windows服务

写好了windows服务以后,再切换到设计页面,右键点击添加安装程序,点击后自动给你添加上一个安装组件,再设置下serviceProcessInstaller1组件的属性(在设计器中设置,不在代码中),其中有…

LeetCode 327. 区间和的个数(multiset二分查找/归并排序)

文章目录1. 题目2. 解题2.1 动态规划超时2.2 二分查找2.3 归并排序1. 题目 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包…

AcWing之二维数组的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例 输入数组: [ [1,2,8,9]&…

sql server排序慢_SQL 查询调优之 where 条件排序字段以及 limit 使用索引的奥秘

(给数据分析与开发加星标,提升数据技能)作者:风过无痕-唐www.cnblogs.com/tangyanbo/p/6378741.html奇怪的慢sql我们先来看2条sql第一条:select * from acct_trans_log WHERE acct_id 1000000000009000757 order by create_time desc limit…

fedora10完全配置文档连接网址

code.google.com/p/fedora-zh/downloads/list 转载于:https://www.cnblogs.com/glc400/archive/2008/12/20/4473856.html