上一篇博客中,客户端已连接到ed2k网络及客户端与服务器交互的eMule源码梳理,这里将开始搜索资源并下载及客户端与客户端交互的eMule源码梳理
emule 源码下载地址 http://download.csdn.net/detail/huang_rong12/9506732搜索资源并下载,这是一个即包含和和服务器交互还包含与另一些客户端交互。所以会先说明和服务端交互的情况(搜索资源,选择资源),在说明下载(与客户端交互)。
搜索资源是发送关键词到服务器,服务器会根据关键词返回信息,当然这些信息是通过消息传递的具体消息如下:
6.2.9 搜索请求
客户发送给服务器的。消息使用用户的一个搜索字符串搜索一个文件。消息大小是可变的。搜索字符串包括布尔运算符’AND’,’OR’, ’NOT’。用户可以详细设置文件的类型大小也可以设置开始位置(例如:展示给我至少5个其他客户端的结果)。
名称 |
占用字节数 |
默认值 |
说明 |
Protocol |
1 |
0xE3 |
|
Size |
4 |
|
不包括标题和size字段的信息大小 |
Type |
1 |
0x16 |
OP_SEARCHRESULT opcode |
Parsed search string |
不定 |
NA |
下面所描述的搜索字符串结构 |
Result list |
不定 |
NA |
搜索结果列表 |
Parsed search string |
不定 |
NA |
解析搜索字符串,格式如下 |
File Type Constraint |
不定 |
NA |
可选的。一个字符串约束。字符串值是Audio”, ”Video”, ”Pro” or ”Image”三者之一。类型域分别对应0x1 0x0 0x3 |
Min Size Constraint |
不定 |
NA |
可选择的,一个整型约束。以兆字节计算的文件大小。类型域有4位:0x1 0x1 0x0 0x2 |
Max Size constraint |
不定 |
NA |
可选择的,一个整型约束。以兆字节计算的文件大小。类型域有4位:0x2 0x1 0x0 0x2 |
Availability Constraint |
不定 |
NA |
可选择的,一个整型约束。搜索文件客户数量的最小上限,类型域有4位:0x1 0x10x0 0x15 |
Filename Extension constrain |
不定 |
NA |
可选择的,一个整型约束。类型域有3位:0x1 0x0 0x3 |
解析搜索字符串格式
解析字符串编码是通过二差树和’AND’,’OR’ ,’NOT’布尔运算符以及字符串操作数。二差树是按照先序编码进行的。操作是编码两位字节值是
The tree is encoded in pre-order . The operators0x0, 0x100, 0x200分别代表了’AND’, ’OR’ 和’NOT’。字符串按照TLV格式进行编码是一个以字节的值和一个两字节的长度。注意当字符串是以各自的时候它代表字符串操作(没有运算符)。以后的eMule 编码版本中指通过单独的字符串’AND’来编码搜索表达式,由空格代替’AND’。由’AND’运算符将连续的单词分开来组成一个句子。
可选择的约束格式
约束数列条目。每一个条目有’AND’描述符开始(2-byte0x00)紧跟着是编码约束。因此一个完整的搜索行格式