第一章的目的是大致了解libed2k怎么使用,libed2k库自带了一个测试工程conn,这一章我们将分析conn,让从我们最关心的下载文件开始。
1.1 解析ed2k链接
通常在网上分享的电驴资源时都是通过ed2k链接的方式,ED2K链接格式为:
ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|h=TQXCJQ2QAYCXKMFQKKHRZJ4WE34T3TDA|/
解析链接的代码在libed2k\include\libed2k\file.hpp中:
static emule_collection_entry fromLink(const std::string& strLink);
它的实现如下:
(1)读取0-13字节并检查是否为“ed2k://|file|”
(2)读取从13字节开始到下一个“|”,得到文件名。
(3)读取从文件名之后到下一个“|”的位置,得到文件大小
(4)读取从文件大小之后到下一个“|”的位置,得到hash值。
(5)丢弃剩余部分“h=TQXCJQ2QAYCXKMFQKKHRZJ4WE34T3TDA”
得到文件名,大小和哈希值后存放到结构体emule_collection_entry中。这个结构体内的成员与这些值一一对应。直接用if(emule_collection_entry)函数可以判断是否是有意义的一个结构体(重载了bool ()操作符)。
1.2 emule任务清单
emule文件集合类(叫做emule任务清单或许更恰当)emule_collection封装了std::deque<emule_collection_entry>并提供了一些额外的操作。
静态函数:
(1)提供从“ed2k://”链接到emule_collection_entry的转换的fromLink方法(见1.1)。
(2)提供从文件名,文件大小和哈希值生成“ed2k://”链接的toLink方法。
(3)从磁盘文件中读取任务清单的fromFile方法。
成员函数:
(1)保存任务清单到文件的save方法。
(2)添加文件到任务清单的add_file方法(需要文件名,文件大小和哈希值)。
(3)添加“ed2k://”链接到任务清单的add_link方法。
(4)从任务清单中根据序号(index)获取emule_collection_entry元素并生成“ed2k://”链接的get_ed2k_link方法。
(5)重载的==操作符,用于对比两个emule_collection是否相同
成员变量:
(1)emule_collection_entry集合
(2)集合