开始分析easymule的代码,写个文档,大家分享。才看了个大概,有多少写多少,以后更新。
1 概况
emule使用vs2005或vs2008开发,使用vc++/mfc。
主要有个解决方案组织:easyMule和easyMule_libs。
easyMule_libs包括十个项目,主要是第三方库。
* cryptlib 加密
* CxImage 图像
* id3lib id3lib is a software development library for reading, writing, and manipulating ID3v1 and ID3v2 tags.
* libpng png图像
* resizableLib mfc自动缩放对话框,自动调节内部控件大小与位置
* sqlite3 数据库
* tinyxml c++xml解析器
* zh_CN 简体中文
* zh_TW 繁体中文
* zlib 压缩
easyMule是主要的代码,包含一个项目。源码位于src目录中。其代码如下:
* header files 头文件
* hotkey 热键
* kademlia kad网络
* resource files 资源文件
* ui layer 界面层
* work layer 工作层
代码分析中数据为重,流程次之,功能再次之。
2 基本数据
* 代表一个实例
o 代表多个实例
* CemuleApp: 继承于CWinApp,主应用程序类。由mfc框架创建。
* CemuleDlg dlg: 主对话框,CemuleApp::InitInstance()中创建。
* CPreferences thePrefs,CStatistics theStats: 前者掌握着程序的大部分配置数据,后者则进行各种统计。thePrefs和theStats是这两个类的唯一的实例。它们的特点都是有很多的成员变量,而且还是静态的,这种方式可以保 证它们的唯一性,而且把这些变量统一到一个类管理。但是实际上并不需要了解每个变量的含义。
* knownfiles = new CKnownFileList(): 它内部维护了一个已知的文件的列表和取消了的文件列表。一个文件对应一个hash值。knownfiles 所需要做的工作就是能够根据一些信息查找到对应的CKnownFile实例。
o CKnownFile 一个文件对应一个CKnownFile实例。具体存取文件信息,操作文件。功能多参见文档1。
* CSearchList: 是emule中的搜索列表,CSearchFile是这个列表中的元素。
o CSearchFile: 是它保存了某个文件和搜索相关的信息。在这个类的定义中嵌套定义了两个简单的结构SServer和SClient,表示了该搜索文件的可能来源,服务器或者其它客户端。
* CServerList: 是emule中负责管理服务器列表的类。在CServerList中,每个服务器的信息是一个CServer实例。
o CServer: 结构比较简单,保留服务器的各种信息。
* CServerConnect: 客户端和服务器之间的所有通信,CServerConnect内部有一列表,可以保存若干CServerSocket类型的指针。
* CListenSocket负责监听某个TCP端口。它只是内部有一个CClientReqSocket类的列表。而CClientReqSocket能够自动完成emule的packet识别工作。
o CClientReqSocket类和CUpDownClient类之间存在着对应关系。它们都表示了另外一个客户端的一些信息,但是CClientReqSocket类主要侧重在网络数据方面,即负责两边的互相通信,而CUpDownClient类负责的是从逻辑上对网络另一边的一个客户端进行表达。
* CDownloadQueue是下载队列类。这个队列中的项目是CPartFile指针。
o CPartFile类是emule中用来表示一个下载任务的类。CPartFile类中Gap_Struct来表示文件的下载情况。CPartFile内部维护一个CUpDownClient的列表,如果知道了该文件的一个新的来源信息,就会创建一个对应的CUpDownClient。
* CUploadQueue是上传队列类。这个列表类中只有以CUpDownClient为元素的列表。上传队列类列表中有两个列表,上传列表和排队列表。
o CUpDownClient 类的作用是从逻辑上表示一个其它的客户端的各种信息,它是emule中代码量最大的类。我们注意到,定义它的头文件是UpDownClient.h,但是却没有对应的CUpDownClient.cpp,而它的实现,都分散到 BaseClient.cpp,DownloadClient.cpp,PeerCacheClient.cpp,UploadClient.cpp和 URLClient.cpp中。
* CGlobalVariable 全局变量类。包含了很多全局的重要数据、类实例的引用。
3 流程
参考文档:
1 eMule源代码解析 好文章,转来转去不知源头 http://hi.baidu.com/elseif/blog/item/3b5fa...cc1.html
2 几篇emule文章 http://hustlg.bokee.com/catalog_7.html (http://hustlg.bokee.com/catalog_7.html)


























