📄 emule源代码学习心得.txt
字号:
CDownloadQueue中的Process方法的主要任务就是把它的列表中的CPartFile类中的Process方法都调一遍,另外主要的一些关于下载情况的统计信息也是在每一轮的Process后进行更新的。从这里我们也可以看出Process方法在emule中的意义,就是一个需要经常执行的方法,通过经常执行它们来完成日常工作,而且所有的这些Process方法肯定是顺序执行,因此可以减少很多多线程的同步之类的问题。emule中已经尽量减少了多线程的使用,但是在很多地方如果多线程是不可避免的话,也不会排斥。
17. eMule源代码学习心得(17):上传任务队列
CUploadQueue是上传队列类。这个列表类中只有以CUpDownClient为元素的列表,它和其它列表类还有一个很大的不同就是它所保存的信息都不需要持久化,即不需要在当前的emule退出后还记住自己正在给谁上传文件,然后下次上线的时候再继续给他们传,这在大部分情况下是没有意义的。
上传队列类列表中有两个列表,上传列表和排队列表。当一个收到一个新的下载请求后,它会把对应的客户端先添加到排队列表中,以后再根据情况,把它们不断添加到上传列表中。在这里,信誉机制将会对此产生影响。
CUploadQueue的Process方法就相对简单了,那就是向上传队列中的所有客户端依次发送数据,而排队的客户端是不会得到这个机会的。另外它还需要完成关于上传方面的一些统计信息。
另外我们还需要注意在CUploadQueue的构造函数里面,创建了一个以100毫秒为间隔的定时器,这个定时器成为以上所有的Process所需要的基础。我们看它的UploadTimer就可以看出这一点。这里面充斥了各个类的Process方法的执行,其中包括以前我们提到的一些类,但是没有提到它们的Process方法,因为其过于简单,基本上就只是更新了一下要保存的信息。
18. eMule源代码学习心得(18):emule中代码量最大的类CUpDownClient
CUpDownClient类的作用是从逻辑上表示一个其它的客户端的各种信息,它是emule中代码量最大的类。我们注意到,定义它的头文件是UpDownClient.h,但是却没有对应的CUpDownClient.cpp,而它的实现,都分散到BaseClient.cpp,DownloadClient.cpp,PeerCacheClient.cpp,UploadClient.cpp和URLClient.cpp中。
BaseClient.cpp中实现的是该类的一些基本的功能,包括基本的各种状态信息的获取和设置,以及按照要求处理和发送各种请求。在这里,逻辑实现和网络进行了区分,CUpDownClient类本身不从网络接受或者发送消息,它只是提供各种请求的处理接口,以及在发送请求时,构造好相应的Packet,并交给自己对应的网络套接字发出去。
DownloadClient.cpp中实现的是和下载相关的功能,它包括了各种下载请求的发送以及相应的数据的接收。另外还有一个A4AF的机制,它是emule中的一个机制,因为一个客户端在同一个时间内只能向另外一个客户端请求同一个文件。这样,对于很多个下载任务(CPartFile),有可能出现它们的源(即有该文件的客户端)有部分重叠的现象,而这时,如果其它下载任务正在从这个源下载,那么当前的下载任务就不能从这个源下载了。但是emule允许用户对其手动进行控制,如对下载任务的优先级进行区分,这样他就可以将一个源从另外一个下载任务那里切换过来。A4AF其实就是ask for another file的简称。
UploadClient.cpp中实现的是上传相关功能,即接受进来的下载请求,并且生成相应的文件块发送出去。
PeerCacheClient.cpp实现的是和PeerCache相关的功能,PeerCache是一个由Joltid公司开发的技术,它可以允许你从ISP提供的一些快照服务器上快速得上传或者下载一些文件(或者是一部分),这个技术的好处是可以减少骨干网络的带宽消耗,将部分本来需要在骨干网上走的流量转移到ISP的内部。当然这个功能需要ISP的配合。如果发现ISP提供了这项服务的话,emule会利用它来减少骨干网的带宽消耗。
URLClient.cpp实现的功能是利用http协议对原有的emule协议进行包装,以便使它能够尽可能地穿越更多的网络的防火墙。
19. eMule源代码学习心得(19):emule常规部分小结
emule中还有其它的很多类,它们使得emule的功能更加的强大和完善。有很多类在前面没有提到,但是不代表它没有作用。而且即时是前面提到的类也只是大体的介绍,它们之间互相配合的一些细节没有体现。但是这些细节应该已经可以通过对它们的大体的功能的了解而更加容易被把握。至于GUI的设计,它也最终是要对应到某个功能实现类的数据的。
对于emule中的通信协议只是大体得描述了一下它的数据包的格式,但是并没有详细得描述它的每一个Opcode对应的包的意义,因为我认为这是没有必要的,在知道通信协议的格式以及处理它们的代码所在的位置后,可以很简单的通过追踪某条消息的前因后果把整个通信协议都分析出来。
这里再稍微提一下在emule中使用到的其它类及其功能。我们可以看到,如果单纯只是为了能够搜到以及下载到文件的话,有不少类是可以精简的,但是,正是由于它们的存在,使得emule的功能更加的完善。CIPFilter,IP地址过滤器,通过识别各种类型的IP地址过滤信息,它能够把不希望连接的网络地址过滤掉,emule中所有需要连接网络的地方使用的都是统一的过滤数据。CWebServer能够在本地打开一个Web服务器,然后你可以通过浏览器来控制你的emule。CScheduler能够实现下载任务的定时下载。CPeerCacheFinder为前面提到的PeerCache技术的主控制类。另外,emule还内置了一个IRC客户端,一个主要成员函数都为静态的CPartFileConvert类,能够对其它版本的驴的下载文件进行转换。它甚至还提供了一个自动处理zip和rar的类CArchiveRecovery。
Kademlia网络是emule中相当重要的一部分,因此特意把这一部分单独拿出来,把它放在这个小结之后进行描述。
20. eMule源代码学习心得(20):emule中的Kademlia代码总体描述
首先要说一下抱歉,这两个星期的事情比较多,所以现在才来写。不过总算是把这些东西写完了。而且最后用的代码是0.47c。
当emule中开始使用Kademlia网络后,便不再会有中心服务器失效这样的问题了,因为在这个网络中,没有中心服务器,或者说,所有的用户都是服务器,所有的用户也是客户端,从而完完全全得实现了P2P。接下来讲针对emule中的Kademlia网络进行分析,会有一节进行原理方面的分析。另外的几节将会根据emule中实现Kademlia所使用的不同的类分别进行讲述。其中:
CKademlia是整个Kademlia网络的主控类,可以直接开始或者停止Kademlia网,并且含有Process方法来处理日常事务。
CPrefs负责处理自身的Kademlia相关信息,如自身的ID等。
CRoutingZone,CRoutingBin和CContact三个类组成了每个节点所了解的联系信息以及由这些联系信息所组成的数据结构。
CKademliaUDPListener负责处理网络信息。
CIndexed负责处理本地存储的索引信息。
CSearch,CSearchManager负责处理和搜索有关的操作,其中前者表示的是一个单一的搜索任务,后者负责对所有搜索任务进行处理。
CUInt128负责处理一个128位的长整数,并且内置其各种运算。前面已经提到过
21. eMule源代码学习心得(21):emule中的Kademlia的基本原理
Kademlia是一种结构化的覆盖网络(Structured Overlay Network),所谓的覆盖网络,就是一种在物理的Internet上面再次构建的虚拟网络,所有参与的节点都知道一部分其它节点的IP地址,这些节点称为它的邻居,如果需要查找什么东西,它先在本地寻找,如果找不到,就把这个查询转发到它的邻居处,希望能够有可能查找到相应的结果。覆盖网络里面分成了结构化和非结构化的两种情况,它们的区别在于每个节点知道哪些其它节点的信息是否有特定的规律。在非结构化的覆盖网中,每个节点的邻居状况没有特定的规律。因此在非结构化网络中,如果要进行查询,会采取一种叫做泛洪(flooding)的方法,每个节点如果在本地没有查找到想要的结果,会把查找请求转发到它的邻居中,然后再通过邻居的邻居这种方式来进行一步步的查找。但是这种方法如果处理不好,会造成整个网络的消息负载过大。已经有不少文章对于优化非结构化覆盖网络中的查询进行了很深入的探讨。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -