最近给一家公司写一个类似电驴的P2P客户端.写的相当的累,但是收获也很大,对电驴的代码进行
了深入的分析,现在把所得贡献给大家,网上有很多对电驴协议的分析,其实有些地方是误导大家了,
中国的程序员还是很小家子气,就是怕别人超过自己.
进入正题,电驴的协议和各种常量参数定义在opcodes.h中,
#define OP_EDONKEYHEADER 0xE3
#define OP_KADEMLIAHEADER 0xE4
这是他的协议码,他大部分的通信包第一个字节都是OP_EDONKEYHEADER 0xE3,
这是他的客户端之间的协议
#define OP_HELLO 0x01 // 0x10<HASH 16><ID 4><PORT 2><1 Tag_set>
#define OP_SENDINGPART 0x46 // <HASH 16><von 4><bis 4><Daten len:(von-bis)>
#define OP_REQUESTPARTS 0x47 // <HASH 16><von[3] 4*3><bis[3] 4*3>
#define OP_FILEREQANSNOFIL 0x48 // <HASH 16>
#define OP_END_OF_DOWNLOAD 0x49 // <HASH 16>
#define OP_ASKSHAREDFILES 0x4A // (null)
#define OP_ASKSHAREDFILESANSWER 0x4B // <count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]
#define OP_HELLOANSWER 0x4C // <HASH 16><ID 4><PORT 2><1 Tag_set><SERVER_IP 4><SERVER_PORT 2>
#define OP_CHANGE_CLIENT_ID 0x4D // <ID_old 4><ID_new 4>
#define OP_MESSAGE 0x4E // <len 2><Message len>
#define OP_SETREQFILEID 0x4F // <HASH 16>
#define OP_FILESTATUS 0x50 // <HASH 16><count 2><status(bit array) len:(