首页 emule源码分析

emule源码分析

举报
开通vip

emule源码分析 1 eMULEeMULEeMULE eMULE 源码分析源码分析源码分析 源码分析 Author: 刘刚 ganghust@gmail.com MSN:ganghust@hotmail.com 博客:http://hustlg.bokee.com 部分翻译和内容材料来源于网络,一并向原作者表示感谢。 已经查看的源代码的版本包括: 1。eMule 0.42b VeryCD0229 2。eMule(电骡) v0.45b 源码 3。eMule0.47a-Sources 4。eMule0.47b-Sources...

emule源码分析
1 eMULEeMULEeMULE eMULE 源码 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 源码分析源码分析 源码分析 Author: 刘刚 ganghust@gmail.com MSN:ganghust@hotmail.com 博客:http://hustlg.bokee.com 部分翻译和内容材料来源于网络,一并向原作者表示感谢。 已经查看的源代码的版本包括: 1。eMule 0.42b VeryCD0229 2。eMule(电骡) v0.45b 源码 3。eMule0.47a-Sources 4。eMule0.47b-Sources 5。eMule-0.47c-VeryCD1215-Src 从 0。42B到 0。47版本主要增强和修改的地方包括: (1)Web管理功能的增强; (2)对服务器探测时间参数的优化; (3)客户端上传队列的过程进行了优化:排队机制和规则上的修改; (4)文件缓存 cache部分改进; (5)KAD网络中搜索功能的改进; 源代码版本:0.47cVeryCD版 eMULE源码分析.......................................................................................................................1 1目录结构:......................................................................................................................1 2 Src\目录下代码结构....................................................................................................... 2 3重要的功能子类..............................................................................................................2 4TCP和 UDP网络通迅过程详细介绍:........................................................................6 5eMule中信誉机制的实现............................................................................................... 8 6下载如上传任务及队列的详细说明:......................................................................... 8 7 其他辅助功能类的说明:...........................................................................................10 8 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 通迅过程的主要约定如下:.............................................................................11 附录 一 ED2K通迅报文处理细节:............................................................................ 11 附录二 eMule中 KAD网络的说明...............................................................................15 附录: eMule中内容发布或者搜索................................................................................. 19 111 1 目录结构: 模块 序号 模块大小 模块名称 备注说明 1 src eMule源代码主要工程 2 Debug:245K Release:105K Zlib 数据压缩支持库,传输过程中支持数据压缩 2 222 2 Src\Src\Src\ Src\ 目录下代码结构 2。1主连接的启动和断开: 1。启动 void CemuleDlg::StartConnection() src/interface/emuleDlg.cpp 2000行 2。断开连接 void CemuleDlg::CloseConnection() src/interface/emuleDlg.cpp 2021行 3. 连接服务器动作的发起点在 sockets.cpp的 145行 4。EMSocket.cpp的 161行开发发起连接,先检查是否设置了代理。 启动流程: 333 3 重要的功能子类 3 Debug:4404K Release:2171 K Id3lib 是用于读、写和操纵 ID3v1 和 ID3v2 标签的 对于媒体类型的文件,它能够调用 id3lib库来获取诸如作者,唱片发行 年代,风格等 tag信息。如果是视频媒体文件,它还会去抓图 4 Debug:653K Release306K Png 提供对 PNG文件处理的支持 5 Debug:1432K Release:517K Resizable Lib 一个界面库,可以根据父窗口的位置和大小动态调整控件窗口的大小. 6 Debug:29284 K Release:26305 K Crypto51 密码类库,实现了各种公开密钥算法、对称加密算法、数字签名算法、 信息摘要算法。eMule之用主要是实现RSA签名,支持独有的积分机制 模块序号 模块名称 备注说明 1 CxImage 图像处理库,与Windows、MFC支持极好,支持图像的多种操作(线 性滤波、中值滤波、直方图操作、旋转缩放、区域选取、阈值处理 、 膨胀腐蚀、alpha混合等等) 2 Kademlia KAD网络的支持 3 Lang 本地语言化支持 4 Res eMule使用的资源包括图标,音乐文件等 5 Wordfilter 搜索关键词语过滤 1。ProcessCommandline。Emue.cpp的331行 通过在注册表里添加一些项目可以让一个程序和某种链接或者某个后缀的文件产生关联。具体办法可以参见 OtherFunctions.cpp中的Ask4RegFix,BackupReg,RevertReg三个函数的功能。 3 序号 类名称 备注与说明 1 CPreferences 掌握着程序的大部分配置数据,它们的特 点都是有很多的成员变量,而且还是静态 的,这种方式可以保证它们的唯一性,而 且把这些变量统一到一个类管理。但是实 际上并不需要了解每个变量的含义。 thePrefs和theStats是这两个类的唯一的实 例。 2 CStatistics 后者则进行各种统计,thePrefs和 theStats 是这两个类的唯一的实例。在 CPreferences.cpp的 485行 Init函数中开始 创建原始的配置文件目录; 3 SafeFile StringConversion CFileDataIO DataIO 数据操作的行为和数据操作的对象分割开 来, 这些类要读取的数据对象通常有这些,各 种整型,字符串,以及 Tag类型。整型读 写起来比较简单,从 1个字节的,2个字节 的到 4个,8个或者 16个字节类型的数据 读写方法都比较类似。 4 CKnownFileList CKnownFile(CKnownFile把读到的文件信息都保 存成一个一个的 Tag。它在运行中会尽量得获取更 多的文件信息,例如,对于媒体类型的文件,它能 够调用 id3lib库来获取诸如作者,唱片发行年代, 风格等 tag信息。如果是视频媒体文件,它还会去 抓图(功能实现:CFrameGrabThread)。CKnownFile 还能够随时掌握目前该文件的下载情况(内部有个 CUpDownClient的列表),当然,还会根据要求序 列化和反序列化自己,LoadFromFile和WriteToFile 都以CFileDataIO为参数,这样方便CKnownFileList 保存和读取它的列表中的所有文件的信息) CKnownFileList类使用了MFC的CMap类 来维护内部的 hash表,它内部维护了一个 已知的文件的列表和取消了的文件列表。 hash表的关键字都是文件 hash值。能够判 断出文件名不同而内容相同的文件。 CKnownFile类是一个专门关注某个特定文 件的信息的类,它仍然有其基 CAbstractFile。但是它和 CAbstractFile类的 主要区别就是 CAbstractFile类只有基本的 信息存取的功能,而 CKnownFile能够主动 的生成这些信息, 5 CKnownFile::CreateFromFile CAICHHash CAICHHashTree CAICHHashAlgo emule中的分块处理和恢复机制,分块处理 以 及 hash 计 算 相 关 的 类 都 在 SHAHashSet.cpp和SHAHashSet.h中。下面 介绍其中几个主要的类:CAICHHash类只 负责一块hash值,提供两个CAICHHash类 之间的直接赋值,比较等基本操作。 CAICHHashAlgo是一个hash算法的通用的 接口, 6 兼容 CAsyncSocket类,即把应用程序中所 4 CAsyncSocketEx ThrottledControlSocket ThrottledFileSocket (任何其它的网络套接字类如果想实现限速的功 能,只需要在其默认的发送函数(如 Send或 Sendto) 中不发送数据而是把数据缓存起来,然后在实现 ThrottledControlSocket或者 ThrottledFileSocket接 口中的 SendFileAndControlData或 SendControlData 方法时才真正把数据发送出去) 以的 CAsyncSocket换成 CAsyncSocketEx, 程序仍然能够和原来的功能相同,因此在 使用上更加方便。效率更高,主要是在消 息分发机制上,即它处理和 SOCKET相关 的消息的效率要比原始的MFC的 CAsyncSocket类更高。另外, CAsyncSocketEx类支持通过实现 CAsyncSocketExLayer类的方式,将一个 SOCKET分成若干个层,从而可以很方便 得实现许多网络功能,如设置代理,或者 是使用 SSL进行加密等 7 UploadBandwidthThrottler 保存若干Socket队列,这些队列的处理方式略有不 同。在 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 队列(m_StandardOrder_list)里面排队的 都是实现了ThrottledFileSocket接口的类,通常这些 类能够传输文件内容也可以传输控制信息。而其它 四个队列都是实现ThrottledControlSocket接口的类 的队列,主要以传输控制信息为主。这四个队列为临 时高优先级,临时普通优先级,正式高优先级,正 式普通优先级。和把套件字直接添加到普通队列 (AddToStandardList) 不 同 , QueueForSendingControlPacket把要添加到队列的 套接字全部添加到两个临时队列。根据它们的优先 级添加到普通的临时队列。在RunInternal的大循环 中,临时队列中的项目先被移到普通队列中,然后 再进行处理。 UploadBandwidthThrottler使用了两 个临界区,两个事件。pauseEvent是用来暂停整个 大循环的动作的。而threadEndedEvent是标志整个 线程停止的事件。sendLocker是大循环中使用的主 要的临界区,而tempQueueLocker是为两个临时队 列额外添加的锁,这样可以一边发送已有队列中的 套界字要发送的数据,一边把新的套接字加到队列 中。 一个WinThread的子类,平时单独运行一 个线程。控制全局的上传速度的. UploadBandwidthThrottler的 RunInternal中 的大循环是该工作线程的日常操作。这个 大循环中做了以下事情,计算本次配额, 即本次循环中能够发送多少字节,好安排 调度,计算本次循环应该睡眠多少时间, 然后进行相应的睡眠,从而进行限速。操 作控制信息队列,发送该队列中的数据, 注意,控制队列中的套接字 (m_ControlQueueFirst_list和 m_ControlQueue_list)只使用一次就离开队 列。而标准队列中的套接字不会这样。在 一轮循环结束后,如果还有没有用完的发 送数据的配额,则会有部分配额保存到下 一轮。 8 CEMSocket CEMSocket是 CAsyncSocketEx和 ThrottledFileSocket的子类。它可以分出状态,如当 前是否在发送控制信息等。 考察它的 SendControl CEMSocket的 SendControlData和 SendFileAndControlData方法其实都是调 用自己的另一个重载的 Send方法。这个方 法是在UploadBandwidthThrottler的工作线 程中的大循环中被调用的,而这个 Send方 法的内容本身也是一个大循环,就是在不 5 Data和SendFileAndControlData方法,这些方法是用 来和 UploadBandwidthThrottler进行配合,以便完 成全局的限速功能的。它的功能应该是按照 UploadBandwidthThrottler的要求,在本次轮到它发 送数据时发送指定数量的字节数。 因此,应用程序的其它部分在使用 CEMSocket时, 如果要达到上传数据限速的目的,不应该直接调用 标准的 Send或者 SendTo方法,而是调用 SendPacket。这里就有了另外一个结构 Packet,它 通常包含一个 emule协议中完整的包,例如有协议 的头部数据等,还内置了 PackPacket和 UnPackPacket方法,可以自行进行压缩和解压的功 能。SendPacket把要发送的 Packet放到自己的队列 中,这个队列也有两个,控制信息包队列,和标准 信息包队列。如果有必要,把自己加入到 UploadBandwidthThrottler的队列中。 超过自己本次发送的配额的情况下,把自 己的包队列中的包取出来,并且发出去。 用到了一个临界区,它是为了保证从包队 列中取出包来发送和把包往队列中放的操 作是互斥的。把它和 UploadBandwidthThrottler结合起来,就看 到了一个两层的队列,即所有的套接字组 成了一个发送队列,在 UploadBandwidthThrottler的控制下保证了 对速度的限制,而每个套接字即将发送的 数据包又组成了一个队列,保证了每次进 行数据发送的时候都会满足 UploadBandwidthThrottler的要求。 9 CSearchList CSearchFile是 CAbstractFile的另一个子类 (CKnownFile也是),它保存了某个文件和搜索相关 的信息,而不是这个文件本身的信息,就是都在哪 些机器上有这个文件,以及哪个服务器上搜到的这 个文件。甚至还可以向搜索文件添加预览。在这个 类的定义中嵌套定义了两个简单的结构 SServer和 SClient,表示了该搜索文件的可能来源,服务器或 者其它客户端。m_aClients和 m_aServers是这两个 简单结构的一个数组,CSearchFile自然也提供了对 这个数组的操作的接口,方便 CSearchList使用。 CSearchList对外提供了搜索表达的接口,即每当有 一个新的搜索提交时 CSearchList::NewSearch会建 立一个新的搜索项,但是此时还没有任何对应的搜 索文件,因此只是在文件个数和搜索 ID的对应表 (m_foundFilesCount和 m_foundSourcesCount)中建 立新的项目。 CSearchList是 emule中的搜索列表,掌管 emule中所有的搜索请求。CSearchFile是 这个列表中的元素,代表了一次搜索的相 关信息。它们的关系和之前描述的已知文 件和已知文件列表有一些类似的地方。 CSearchList的主要任务就是对其一个叫做 list的类型为 CSearchFile列表的内部变量 进行维护,提供很方便得往这个列表中添 加,删除,查询,变更等操作的接口。另 外,每一个搜索都有一个 ID,是一个 32 位的整数。CSearchList中记录了每个搜索 目前搜到的文件个数和源的个数 (m_foundFilesCountm_foundSourcesCount) 当有搜索结果返回时 ProcessSearchAnswer 或 ProcessUDPSearchAnswer能够对返回的 包直接做处理,创建相应的搜索文件信息 CSearchFile对象,并加入到自己的列表中。 当然,要把重复的搜索结果去除,发现同 一个 hash的文件的多个源时也会给它们建 立一个二级列(CSearchFile::m_list_parent)。 CSearchList只负责和搜索有关的信息的储 存和读取,本身并不进行搜索。 10 CServerList CServerList除了提供通常的 CServer信息外,还提 供一些统计信息诸如所有的服务器的用户数,共享 的文件数等。这些统计信息也是基于每个单独的 CServer的相关信息计算出来的。 CServerList是 emule中负责管理服务器列 表的类。CServerList需要对外提供列表的 增加,删除,查找,修改等接口。在 CServerList中,每个服务器的信息是一个 CServer类。和搜索信息不一样,但是和已 知文件列表一样,服务器的信息列表是需 6 4TCP4TCP4TCP 4TCP 和 UDPUDPUDP UDP 网络通迅过程详细介绍: 要长期保留的,因此 CServerList和 CKnownFileList类一样提供了把它所包含 的所有信息保存到一个文件中,以及从这 个文件中读回其信息的功能。CServer中的 结构比较简单,只需要保留服务器的各种 信息即可。它可以通过 IP地址和端口来创 建,也可以通过一个简单的结构 ServerMet_Struct来创建,其中后者是用来 直接从文件中读取的。该结构仅仅包含 IP 地址和端口以及属性的个数,CServer中其 它的属性在保存到文件中时,均采用 Tag 方式保存。 11 Packet 它内部实现了压缩和解压的方法,该方法直接调用 zlib库中的压缩方法,可以减少数据的传输量。这 里要注意一点的就是压缩的时候协议簇代码是不 参与压缩的,压缩完毕后会更换协议簇代码,例如 代码为标准 edonkey协议 0xE3的包在压缩后,协 议代码就变成 0xD4了,这里进行协议代码变化是 为了使接受方能够正确识别并且进行相应的解压 操作。 它是 emule的通信协议的最小单位。我们 可以看出,它的构造函数有多个版本,这 也是为了可以用不同的方式来创建Packet。 例如只包含一个头部信息的缓冲区,或者 只是指定协议簇代码等。 通迅的双方及方式 完成此功能的主要类 说明 Client-Server TCP CServerConnect ( 通 过 分 析 CServerSocket::ProcessPacket 就可以直接把emule客户端和 服务器之间的通信协议理解 清楚,这里是服务器发回的 包。TCP连接建立后的第一个 包 是 在 CServerConnect::ConnectionE stablished中发出的,即向服务 器发出登陆信息。如果登陆成 功,则能够从服务器处获取自 己的ID,这是一个32位的长 CServerConnect本身不是套 接字的子类,但是它的成员变 量 CServerSocket 类 型 的 connectedsocket 是 。 CServerConnect内部有一列 表 , 可 以 保 存 若 干 CServerSocket类型的指针。但 是这并不说明它平时连接到 很多服务器上。它只是可以同 时试图连接到若干个服务器 上,这只是因为连接到服务器 上的行为不一定能成功。 CServerSocket类是CEMSock 7 整数 。 如 果 这 个 数 小 于 16777216,那么我们称它为 LowID。具有LowID的客户端 通常情况下其它客户端将不 能直接连接它。得到LowID 的原因比较多,例如当自己处 于NAT的后端的时候。获取自 己的ID后将会向服务器发送 自己的共享文件列表,这一动 作 由 共 享 文 件 列 表 类 CSharedFileList来完成。) et的子类,它比CEMSocket要 多保存一些状态,比如当前的 服务器连接状态。它同时还保 留它当前所连接的服务器的 信息。 Client-Client TCP CListenSocket CClientReqSocket ( CListenSocket 和 CClientReqSocket类之间的关 系和前面分析的列表类和它 对应的成员类的关系是相似 的,CListenSocket提供对自身 的CClientReqSocket列表中的 元素的增加,查询,删除等操 作。同时也维护关于这些成员 的一些统计信息。我们注意到 CListenSocket在其构造函数 中 就 把 自 己 添 加 到 CListenSocket 类 (theApp.listensocket,该类的 唯一实际示例)的列表中。 CClientReqSocket 类 和 CUpDownClient类之间存在 着对应关系。它们都表示了另 外一个客户端的一些信息,但 是CClientReqSocket类主要侧 重在网络数据方面,即负责两 边 的 互 相 通 信 , 而 CUpDownClient类负责的是 从逻辑上对网络另一边的一 个客户端进行表达。) 由 CListenSocket 和 CClientReqSocket完成。这也 是提供网络服务的应用程序 的 典 型 写 法 。 其 中 CListenSocket 只 是 CAsyncSocketEx的子类,只 负责监听某个TCP端口。它只 是 内 部 有 一 个 CClientReqSocket类的列表。 而 CClientReqSocket 是 CEMSocket的子类,因此它能 够自动完成emule的packet识 别工作。它有ProcessPacket 和ProcessExtPacket来处理客 户端和客户端之间的包,其中 前者是经典的eDonkey协议 的包,后者是emule扩展协议 的包。 Client-Server UDP CUDPSocket 走UDP协议的包,因为UDP 本来就是以一个包一个包作 为单位在网络上流传的,不需 要在包的内容中再包含表示 长度的字段。每个UDP包的第 Client-Client UDP CClientUDPSocket Kademlia::CKademliaUDP Listener 8 5eMule5eMule5eMule 5eMule 中信誉机制的实现 666 6 下载如上传任务及队列的详细说明: 一个字节是协议簇代码,其它 内 容 就 是 包 的 内 容 。 CKademliaUDPListener类,专 门处理和Kademlia协议相关 的UDP包。 主要实现的类 说明 1 CClientCreditsList 和信誉相关的信息是需要永 久保存的,这样才有意义,因 此 CClientCreditsList提供了 LoadList和SaveList方法。 2 CClientCredits CClientCredits类 可 以 使 用 CreditStruct结构来创建,而 CreditStruct结构只包含静态 信息,主要是上传量和下载量 等。 信誉机制的信息需要有一定的可靠性,在emule中采用了数字签名的方式来做到这一点。 Crypto++库为emule全程提供和数字签名验证相关的功能。CClientCreditsList在创建时,会装 载自己的公钥私钥,如果没有的话,会创建一对。CClientCreditsList中包含的有效的信息都 是经过其它人数字签名的,所以更加有信服力。在实际使用中,这些信息和自己的私钥要注 意保存。重装emule后应该把配置文件目录先备份,这样能够保留自己辛辛苦苦积攒的信誉。 功能说明 类 说明 部分文件表示 CPartFile (CPartFile它的创建就有几种可能,从搜索 文件 CSearchFile中创建,这种情况发生在用 户搜索到他想要的文件后点击下载时发生。 从一个包含了 ed2k链接的字符串中创建,它 会提取出该 ed2k链接中的信息,并用来创建 CPartFile。剩下的一种,就是当 emule程序 重启后,恢复以前的下载任务。这时就是去 CPartFile类是 emule中用来表示一个下 载任务的类。这就是一个还没有完成的 文件。当一个下载任务被创建时,emule 会在下载目录中创建两个文件,以三位 数字加后缀 part的文件,例如 001.part, 002.part等。还有一个以同样的数字加 上.part.met的文件,表示的是对应文件 的元信息。part文件会创建得和原始文 9 下载目录中寻找那些.part和.met文件了。另 外它还需要不断得处理下载到的数据,为了 减少磁盘开销,使用了 Requested_Block_Struct结构来暂存写入的 数据。它内部维护一个 CUpDownClient的列 表,如果知道了该文件的一个新的来源信 息,就会创建一个对应的 CUpDownClient。 后者是 emule中代码量最大的类。它还要把 它的状态用彩色的条装物显示出来提供给 GUI。) 件大小一样,当下载完成后,文件名会 修改成它本来的名称。而事实上,诸如 这个文件原来叫什么名称,修改日期等 等信息都在对应的.part.met元文件 中。.part.met中还包含了该文件中那些 部分已经下载完成的信息。CPartFile类 中 Gap_Struct来表示文件的下载情况, 一个 Gap_Struct就是一个坑,它表示该 文件从多少字节的偏移到多少字节偏移 是一个坑。下载的过程就是一个不断填 坑的过程。CPartFile类中有个成员变量 gaplist就是该文件目前的坑的状况列 表。需要主要的是有时填了坑的中间部 分后,会把一个坑变成两个坑。坑的列 表也会被存进.part.met中。 下载 CDownloadQueue (CDownloadQueue中的 Process方法的主要 任务就是把它的列表中的 CPartFile类中的 Process方法都调一遍,另外主要的一些关于 下载情况的统计信息也是在每一轮的 Process后进行更新的。从这里我们也可以看 出 Process方法在 emule中的意义,就是一 个需要经常执行的方法,通过经常执行它们 来完成日常工作,而且所有的这些 Process 方法肯定是顺序执行,因此可以减少很多多 线程的同步之类的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。emule中已经尽量 减少了多线程的使用,但是在很多地方如果 多线程是不可避免的话,也不会排斥。 ) CDownloadQueue是下载队列类。这个 队列中的项目是 CPartFile指针。它需要 能够提供对这个列表中的元素进行增 加,查询,删除的功能。例如查询的时 候能够根据该文件的 hashID或者索引 来进行查询。CDownloadQueue同时还 要完成一些统计工作。 和其它的列表类不一样的是,它的所有 元素的信息并不是集中存放于一个文 件,而是对应于每一个下载任务,单独 得存放在一个元信息文件(.part.met)中 , 因此当该类进行初始化的时候,它需要 寻找所有可能的下载路径,从那些路径 中找到所有的.part.met文件,并且试图 用这些文件来生成 CPartFile类,并且将 这些通过.part.met文件正确生成的 CPartFile类添加到自己的列表中,同样, 在退出时,所有的下载任务的元信息也 是自行保存,不会合成为一个文件。 上传 CUploadQueue (CUploadQueue的 Process方法就相对简单 了,那就是向上传队列中的所有客户端依次 发送数据,而排队的客户端是不会得到这个 机会的。另外它还需要完成关于上传方面的 一些统计信息。在 CUploadQueue的构造函 数里面,创建了一个以 100毫秒为间隔的定 时器,这个定时器成为以上所有的 Process 所需要的基础。) CUploadQueue是上传队列类。这个列表 类中只有以CUpDownClient为元素的列 表,它和其它列表类还有一个很大的不 同就是它所保存的信息都不需要持久 化,即不需要在当前的 emule退出后还 记住自己正在给谁上传文件,然后下次 上线的时候再继续给他们传,这在大部 分情况下是没有意义的。他有两个列表, 上传列表和排队列表。当收到一个新的 下载请求后,它会把对应的客户端先添 10 777 7 其他辅助功能类的说明: 在 emule中使用到的其它类及其功能。我们可以看到,如果单纯只是为了能够搜到以及下 载到文件的话,有不少类是可以精简的,但是,正是由于它们的存在,使得 emule的功能更 加的完善。CIPFilter,IP地址过滤器,通过识别各种类型的 IP地址过滤信息,它能够把不 希望连接的网络地址过滤掉,emule中所有需要连接网络的地方使用的都是统一的过滤数 据 。CWebServer能够在本地打开一个Web服务器,然后你可以通过浏览器来控制你的 emule。 CScheduler能够实现下载任务的定时下载。CPeerCacheFinder为前面提到的 PeerCache技术 的主控制类。另外,emule还内置了一个 IRC客户端,一个主要成员函数都为静态的 加到排队列表中,以后再根据情况,把 它们不断添加到上传列表中。在这里, 信誉机制将会对此产生影响。 上传和下载的 辅助类 CUpDownClient BaseClient.cpp中实现的是该类的一些基本 的功能,包括基本的各种状态信息的获取和 设置,以及按照要求处理和发送各种请求。 在这里,逻辑实现和网络进行了区分, CUpDownClient类本身不从网络接受或者发 送消息,它只是提供各种请求的处理接口, 以及在发送请求时,构造好相应的 Packet, 并交给自己对应的网络套接字发出去。 DownloadClient.cpp中实现的是和下载相关 的功能,它包括了各种下载请求的发送以及 相应的数据的接收。另外还有一个 A4AF的 机制,它是 emule中的一个机制,因为一个 客户端在同一个时间内只能向另外一个客 户端请求同一个文件。这样,对于很多个下 载任务(CPartFile),有可能出现它们的源(即 有该文件的客户端)有部分重叠的现象,而这 时,如果其它下载任务正在从这个源下载, 那么当前的下载任务就不能从这个源下载 了。但是 emule允许用户对其手动进行控制, 如对下载任务的优先级进行区分,这样他就 可以将一个源从另外一个下载任务那里切 换过来。A4AF其实就是 ask for another file 的简称。 UploadClient.cpp中实现的是上传相关功能, 即接受进来的下载请求,并且生成相应的文 件块发送出去。 CUpDownClient类的作用是从逻辑上表 示一个其它的客户端的各种信息,它是 emule中代码量最大的类。我们注意到, 定义它的头文件是 UpDownClient.h,但 是却没有对应的 CUpDownClient.cpp, 而它的实现,都分散到 BaseClient.cpp, DownloadClient.cpp, PeerCacheClient.cpp,UploadClient.cpp 和 URLClient.cpp中。 PeerCacheClient.cpp实现的是和 PeerCache相关的功能,PeerCache是一 个由 Joltid公司开发的技术,它可以允 许你从 ISP提供的一些快照服务器上快 速得上传或者下载一些文件(或者是一 部分),这个技术的好处是可以减少骨干 网络的带宽消耗,将部分本来需要在骨 干网上走的流量转移到 ISP的内部。当 然这个功能需要 ISP的配合。如果发现 ISP提供了这项服务的话,emule会利用 它来减少骨干网的带宽消耗。 URLClient.cpp实现的功能是利用http协 议对原有的 emule协议进行包装,以便 使它能够尽可能地穿越更多的网络的防 火墙。 11 CPartFileConvert类,能够对其它版本的驴的下载文件进行转换。它甚至还提供了一个自动 处理 zip和 rar的类 CArchiveRecovery。 8 协议通迅过程的主要约定如下: emule的通信协议格式设计成一种便于扩充的格式。对于 TCP连接来说,连接中的数据流 都能够划分成为一个一个的 Packet,CEMSocket类中就完成了把接收到的数据划分成 Packet 这一工作。但是具体的对于每个 Packet进行处理的工作被转移到它的子类中进行。 CEMSocket类的两个子类CServerSocket和CClientReqSocket所代表的 TCP连接就分别是客 户端和服务器之间的 TCP连接以及客户端之间的 TCP连接。在数据流中的第一个字节代表 的是通信的协议簇代码,如 0xE3为标准的 edonkey协议,0xE4为 kademlia协议等等。接下 来的四个字节代表包内容的长度,所有的包都用这种方式发送到 TCP流中,就可以区分出 来了。另外每个包内容中的第一个字节为 opcode,即在确定了某个具体协议后,这个 opcode 确定了这个包的具体含义。 对于走 UDP协议的包,处理起来更加得简单,因为 UDP本来就是以一个包一个包作为单位 在网络上流传的,因此不需要在包的内容中再包含表示长度的字段。每个 UDP包的第一个 字节是协议簇代码,其它内容就是包的内容。CClientUDPSocket类负责处理客户端和客户 端之间的 UDP包,而 CUDPSocket类负责处理客户端和服务器之间的 UDP包。另外还有个 Kademlia::CKademliaUDPListener类,专门处理和 Kademlia协议相关的 UDP包。 附录 一 ED2KED2KED2K ED2K 通迅报文处理细节: (以 0。47版 VeryCD为准), Ethereal截获报文(连接服务器的 TCP 5000端口)下面的是 登陆过程中实际的通迅报文。 1。登陆报文 报文结构如下: 0000 00 00 0c 07 ac 47 00 18 8b 88 94 30 08 00 45 00 .....G.....0..E. 0010 00 7b 49 91 40 00 80 06 65 e5 ac 1e 15 7b 55 11 .{I.@...e....{U. 0020 34 5c 08 c7 13 88 fb 92 96 ad 1f e8 22 d4 50 18 4\..........".P. 0030 ff ff 4b 74 00 00 e3 4e 00 00 00 01 eb 28 9a dd ..Kt...N.....(.. 0040 33 0e 64 10 a4 d1 42 9d c2 91 6f 62 dc aa 01 00 3.d...B...ob.... 0050 e5 6a 04 00 00 00 02 01 00 01 15 00 5b 43 48 4e .j..........[CHN 0060 5d 5b 56 65 72 79 43 44 5d 79 6f 75 72 6e 61 6d ][VeryCD]yournam 0070 65 03 01 00 11 3c 00 00 00 03 01 00 20 19 03 00 e....<...... ... 0080 00 03 01 00 fb 00 bd 00 00 ......... 12 2。登陆回应报文: 0000 00 18 8b 88 94 30 00 0e d6 d4 cc 00 08 00 45 00 .....0........E. 0010 00 83 c3 5e 40 00 28 06 3e d9 c1 8a cd 19 ac 1e ...^@.(.>....... 0020 15 7b 13 88 08 c8 82 96 3b 09 ba aa 2b f4 50 18 .{......;...+.P. 0030 16 d0 7e 90 00 00 e3 56 00 00 00 38 53 00 57 41 ..~....V...8S.WA 0040 52 4e 49 4e 47 20 3a 20 59 6f 75 20 68 61 76 65 RNING : You have 0050 20 61 20 6c 6f 77 69 64 2e 20 50 6c 65 61 73 65 a lowid. Please 0060 20 72 65 76 69 65 77 20 79 6f 75 72 20 6e 65 74 review your net 0070 77 6f 72 6b 20 63 6f 6e 66 69 67 20 61 6e 64 2f work config and/ 0080 6f 72 20 79 6f 75 72 20 73 65 74 74 69 6e 67 73 or your settings 0090 2e . 3.3.3. 3. IDIDID ID 改变 和服务器消息 服务器发送 ID改变的消息,作为对登录请求消息的回应和表示服务器已经接收客户端的连 接。 0000 00 18 8b 88 94 30 00 0e d6 d4 cc 00 08 00 45 00 .....0........E. 0010 02 7b c3 5f 40 00 28 06 3c e0 c1 8a cd 19 ac 1e .{._@.(.<....... 0020 15 7b 13 88 08 c8 82 96 3b 64 ba aa 2b f4 50 18 .{......;d..+.P. 0030 16 d0 a0 e1 00 00 e3 11 00 00 00 40 50 30 72 00 ...........@P0r. 0040 f9 07 00 00 88 13 00 00 db 85 28 fa e3 09 00 00 ..........(..... 0050 00 34 85 46 01 00 a1 28 37 01 e3 22 00 00 00 38 .4.F...(7.."...8 0060 1f 00 73 65 72 76 65 72 20 76 65 72 73 69 6f 6e ..server version 0070 20 31 37 2e 31 34 20 28 6c 75 67 64 75 6e 75 6d 17.14 (lugdunum 0080 29 e3 65 00 00 00 38 62 00 ef bb bf e5 8e 8c e7 ).e...8b........ 0090 83 a6 e4 ba 86 e7 ad 89 e4 b8 8a e5 a5 bd e5 87 ................ 00a0 a0 e5 a4 a9 e6 89 8d e8 83 bd e8 8e b7 e5 8f 96 ................ 00b0 e6 96 87 e4 bb b6 ef bc 9f e4 b8 8d e6 83 b3 e8 ................ 00c0 ae a9 e5 85 b6 e4 bb 96 e4 ba ba e5 91 98 e8 ae ................ 00d0 bf e9 97 ae e6 82 a8 e7 9a 84 20 49 50 20 e5 9c .......... IP .. 00e0 b0 e5 9d 80 ef bc 88 70 32 70 20 e3 21 00 00 00 .......p2p .!... 00f0 38 1e 00 e5 85 b7 e6 9c 89 e5 9c b0 e5 9d 80 e4 8............... 0100 ba a4 e6 8d a2 e5 8a 9f e8 83 bd ef bc 89 ef bc ................ 0110 9f e3 6a 00 00 00 38 67 00 e4 bd bf e7 94 a8 20 ..j...8g....... 0120 68 74 74 70 3a 2f 2f 63 6e 2e 72 61 7a 6f 72 62 http://cn.razorb 0130 61 63 6b 33 2e 63 6f 6d ef bc 8c e6 82 a8 e5 8f ack3.com........ 0140 af e4 bb a5 e4 bd bf e5 ae bd e5 b8 a6 e8 bf 9e ................ 0150 e6 8e a5 e9 80 9f e5 ba a6 e8 be be e5 88 b0 e6 ................ 0160 9e 81 e8 87 b4 ef bc 8c e5 b9 b6 e5 8f af e5 8c ................ 0170 bf e5 90 8d e4 b8 8b e8 bd bd 20 31 30 30 25 20 .......... 100% 0180 e3 0c 00 00 00 38 09 00 e5 86 85 e5 ae b9 e3 80 .....8.......... 0190 82 e3 21 00 00 00 38 1e 00 e8 8e b7 e5 8f 96 e4 ..!...8......... 01a0 b8 a4 e5 91 a8 e7 9a 84 e5 85 8d e8 b4 b9 e8 af ................ 13 01b0 95 e7 94 a8 ef bc 81 e3 3d 00 00 00 38 3a 00 e5 ........=...8:.. 01c0 9c a8 20 68 74 74 70 3a 2f 2f 63 6e 2e 72 61 7a .. http://cn.raz 01d0 6f 72 62 61 63 6b 33 2e 63 6f 6d 20 e4 b8 8a ef orback3.com .... 01e0 bc 8c e6 82 a8 e5 8f af e4 bb a5 e8 ae bf e9 97 ................ 01f0 ae 20 33 30 30 20 54 42 20 e3 56 00 00 00 38 53 . 300 TB .V...8S 0200 00 e5 ae b9 e9 87 8f e7 9a 84 e5 ba 94 e7 94 a8 ................ 0210 e7 a8 8b e5 ba 8f 5b e8 a8 bb 3a e8 bd af e4 bb ......[...:..... 0220 b6 5d e3 80 81 e7 94 b5 e5 bd b1 e3 80 81 e6 b8 .].............. 0230 b8 e6 88 8f e3 80 81 4d 50 33 20 e6 88 96 e4 b8 .......MP3 ..... 0240 8d e5 8f 97 e9 99 90 e5 88 b6 e7 9a 84 20 58 58 ............. XX 0250 58 e3 80 82 e3 30 00 00 00 38 2d 00 e6 af 8f e5 X....0...8-..... 0260 a4 a9 e5 a2 9e e5 8a a0 20 31 35 30 30 20 47 42 ........ 1500 GB 0270 20 e4 bb a5 e4 b8 8a e5 ae b9 e9 87 8f e7 9a 84 ............... 0280 e6 96 87 e4 bb b6 ef bc 81 ......... 4。文件提供 该消息被客户端用来描述可获得的当地文件,让其它客户端下载。如果客户端有文件提 供,文件提供消息立即在连接建立之后发送。当客户端共享文件列表发生改变时,该消息也 会发送。该消息的另一用法是周期地发送到服务器,保持活动状态。如果服务器支持压缩, 文件提供(消息)会被压缩。当用作保持活动状态(没有文件压缩和消息大小很小)时,该 消息不被压缩。 0000 00 00 0c 07 ac 47 00 18 8b 88 94 30 08 00 45 00 .....G.....0..E. 0010 00 61 49 99 40 00 80 06 60 c0 ac 1e 15 7b c1 8a .aI.@...`....{.. 0020 cd 19 08 c8 13 88 ba aa 2b f4 82 96 3d b7 50 18 ........+...=.P. 0030 fd 51 50 91 00 00 e3 34 00 00 00 15 01 00 00 00 .QP....4........ 0040 0d 6f 41 12 a1 b5 61 d8 d0 de be 75 8b 28 b8 06 .oA...a....u.(.. 0050 fb fb fb fb fb fb 03 00 00 00 9a 01 55 70 64 61 ............Upda 0060 74 65 2e 65 78 65 83 02 2b 7f 21 00 89 03 04 te.exe..+.!.... 0000 00 00 0c 07 ac 47 00 18 8b 88 94 30 08 00 45 00 .....G.....0..E. 0010 00 28 49 9d 40 00 80 06 60 f5 ac 1e 15 7b c1 8a .(I.@...`....{.. 0020 cd 19 08 c8 13 88 ba aa 2c 33 82 96 40 cd 50 10 .
本文档为【emule源码分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_168386
暂无简介~
格式:pdf
大小:331KB
软件:PDF阅读器
页数:20
分类:互联网
上传时间:2010-11-12
浏览量:26