



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、eMule源代码解析 -2 2006-10-16 17:4 1分块机制-正确传输资源的保证 为了加快内容分发的速度,分块处理是一种简单有效的方法。emule中对每个文件都进行了分块处理。另外分块还有一个好处就是如果保留了每一分块的hash值,就能在只下载到文件的一部分时判断出下载内容的有效性。 emule在获取每个共享文件的信息时,就对它进行了分块处理,因此如果要知道emule中的分块处理和恢复机制,看CKnownFile:CreateFromFile函数的实现就行了。 这个函数中牵涉到的和分块处理以及hash计算相关的类都在SHAHashSet.cpp和SHAHashSet.h中。 下面介绍
2、其中几个主要的类: CAICHHash类只负责一块hash值,提供两个CAICHHash类之间的直接赋值,比较等基本操作。CAICHHashAlgo是一个hash算法的通用的接口,其它hash算法只要实现这种接口都能使用,这样,可以很方便得使用不同的hash算法来计算hash值。CAICHHashTree则是一个树状的hash值组织方式,它有一个左子树和右子树成员变量,类型是指向CAICHHashTree的指针,这是一个典型的实现树状结构的方法。CAICHHashSet中包含了一个CAICHHashTree类型的变量,它直接向CKnownFile负责,代表的是一个文件的分块信息。 SHAHas
3、hSet.h文件的开始的注释部分向我们解释了它的分块的方式。这里要用到两个常量9728000和184320,它们分别是9500k和180k。这是emule中两种不同粒度的分块方式,即首先把一个很大的文件分割成若干个9500k的块,把这些块组织成一颗树状的结构,然后每一个这样的块又分解成若干个180k的块(52块,再加一个140k的块,仍然按照树状的结构组织起来。最后总的结构还是一颗树。 CKnownFile:CreateFromFile方法是在读取目标文件的内容时,逐步建立起这样一颗树的。CAICHHashTree:FindHash能够根据读取到的目标文件的偏移量和下一块的大小,来找出对应的树
4、枝节点(就是一个指向CAICHHashTree的指针。如果有必要的话,还会自动创建这些树枝节点。因此在进行分块操作的时候,把文件从头到尾读一边,整个CAICHHashTree就建立起来了,对应的分块hash值也赋值好了。 最后我们还需要注意的就是CKnownFile类中的hashlist变量。就是说它还单独保留直接以9728000字节为单位的所有分块的MD4算法的hash值。这样对于一个文件就有了两套分块验证的机制,能够适应不同场合 网络基础设施-网络基础设施的基础设施 MFC中已经有一些网络基础设施类,如CAsyncSocket等。但是emule在设计中,为了能够更加高效得开发网络相关的代码
5、,构建了另外的一些类作为基础设施,这些基础设施类的代码也有很高的复用价值。 首先是CAsyncSocketEx类。AsyncSocketEx.h中对这个类的特点已经给出了 一定的说明。它完全兼容CAsyncSocket类,即把应用程序中所以的CAsyncSocket换成CAsyncSocketEx,程序仍然能够和原来的功能相同,因此在使用上更加方便。但是在这个基础上,它的效率更高,主要是在消息分发机制上,即它处理和SOCKET相关的消息的效率要比原始的MFC的CAsyncSocket类更高。 另外,CAsyncSocketEx类支持通过实现CAsyncSocketExLayer类的方式,将一个
6、SOCKET分成若干个层,从而可以很方便得实现许多网络功能,如设置代理,或者是使用SSL进行加密等。 另外还有ThrottledSocket.h中定义的ThrottledControlSocket类和ThrottledFileSocket类,这两个类只定义了两个接口。任何其它的网络套接字类如果想实现限速的功能,只需要在其默认的发送函数(如Send或Sendto中不发送数据而是把数据缓存起来,然后在实现ThrottledControlSocket或者ThrottledFileSocket接口中的SendFileAndControlData或SendControlData方法时才真正把数据发送出去
7、,这样就能实现上传限速,而这也是需要UploadBandwidthThrottler类进行配合,UploadBandwidthThrottler是一个WinThread的子类,平时单独运行一个线程。下一次会详细描述它是如何控制全局的上传速度的。 网络基础设施-全局限速器UploadBandwidthThrottler UploadBandwidthThrottler是emule中使用的全局的上传限速器。它继承了CWinThread类,且在该类被创建的时候,就新创建一个线程开始单独运行。在该类被析构时也会自动停止相应的线程。这个线程的目标函数就是RunProc,然后为了避免在RunProc函数不
8、能使用this指针的情况,它使用了RunInternal来实际完成工作线程的工作。在emule中,还有另外一个类LastCommonRouteFinder有类似的结构。 UploadBandwidthThrottler中保存了若干的套接字(Socket队列,这些队列的处理方式略有不同。在标准队列(m_StandardOrder_list里面排队的都是实现了ThrottledFileSocket接口的类,通常这些类能够传输文件内容也可以传输控制信息。 而其它四个队列都是实现ThrottledControlSocket接口的类的队列,在这些队列中的类主要以传输控制信息为主。 这四个队列为临时高优先
9、级,临时普通优先级,正式高优先级,正式普通优先级。和把套件字直接添加到普通队列(AddToStandardList不同, QueueForSendingControlPacket把要添加到队列的套接字全部添加到两个临时队列。根据它们的优先级添加到普通的临时队列。在RunInternal的大循环中,临时队列中的项目先被移到普通队列中,然后再进行处理。 UploadBandwidthThrottler使用了两个临界区,两个事件。pauseEvent是用来暂停整个大循环的动作的。而threadEndedEvent是标志整个线程停止的事件。sendLocker是大循环中使用的主要的临界区,而tempQ
10、ueueLocker是为两个临时 队列额外添加的锁,这样可以一边发送已有队列中的套界字要发送的数据,一边把新的套接字加到队列中。 UploadBandwidthThrottler的RunInternal中的大循环是该工作线程的日常操作。这个大循环中做了以下事情,计算本次配额,即本次循环中能够发送多少字节,好安排调度,计算本次循环应该睡眠多少时间,然后进行相应的睡眠,从而进行限速。操作控制信息队列,发送该队列中的数据,注意,控制队列中的套接字(m_ControlQueueFirst_list和m_ControlQueue_list只使用一次就离开队列。而标准队列中的套接字不会这样。在一轮循环结束
11、后,如果还有没有用完的发送数据的配额,则会有部分配额保存到下一轮。 网络基础设施-emule套接字CEMSocket CEMSocket是CAsyncSocketEx和ThrottledFileSocket的子类,它把若干功能整合到了一起,因此可以作为emule使用起来比较方便的套接字。例如它可以很方便得指定代理,把CAsyncSocketEx中的创建一个新的代理层并且添加到列表中的功能对外屏蔽了。另外它可以分出状态,如当前是否在发送控制信息等。 CEMSocket中我们需要仔细考察的是它的SendControlData和SendFileAndControlData方法。如前所述,这些方法是用
12、来和UploadBandwidthThrottler进行配合,以便完成全局的限速功能的。它的功能应该是按照UploadBandwidthThrottler的要求,在本次轮到它发送数据时发送指定数量的字节数。因此,应用程序的其它部分在使用CEMSocket时,如果要达到上传数据限速的目的,不应该直接调用标准的Send或者SendTo方法,而是调用SendPacket。这里就有了另外一个结构Packet,它通常包含一个emule协议中完整的包,例如有协议的头部数据等,还内置了PackPacket和UnPackPacket方法,可以自行进行压缩和解压的功能。SendPacket把要发送的Packet放到自己的队列中,这个队列也有两个,控制信息包队列,和标准信息包队列。如果有必要,把自己加入到UploadBandwidthThrottler的队列中。 我们注意到CEMSocket的SendControlData和SendFileAndControlData方法其实都是调用自己的另一个重载的Send方法。而且我们也已经知道这个方法是在UploadBandwidthThrottler的工作线程中的大循环中被调用的,而这个Send方法的内容本身也是一个大循环,但是意义很明了,就是在不超过自己本次发送的配额的情况下,把自己的包队列中的包取出来,并且发出去。同样,这里也用到了一个临界区,它是为了保
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学习心得体会演讲稿(33篇)
- 二年级下册数学期末总结范文(9篇)
- 新车间年度工作计划
- 建筑固体废弃物资源化利用建议书可行性研究报告备案
- 简单个人房屋租赁合同范本
- 马术俱乐部一季度安全生产培训
- 小学教育教学知识与能力-教师资格证考试《小学教育教学知识与能力》模拟题5
- 小学教育教学知识与能力-教师资格证考试《小学教育教学知识与能力》标准预测试卷2
- 赤峰输配电测试设备项目申请报告
- 2024年初中历史教师年度工作总结
- 家长会课件:小学三年级家长会 课件
- 医院专业技术年度考核总结报告
- 2024中考道法时政热点《中国外交大事大盘点》课件
- 小学生国家文化安全教育
- 2024年消防初级考试模拟试题和答案
- 小学五年级奥数竞赛试题(含答案)
- Unit-3-Reading-and-thinking课文详解课件-高中英语人教版必修第二册
- 品牌服装设计课件
- 小学六年级美术期末试卷及答案课件
- DB11T 381-2023既有居住建筑节能改造技术规程
- NB-T 47013.7-2012(JB-T 4730.7) 4730.7 承压设备无损检测 第7部分:目视检测
评论
0/150
提交评论