发现大家老问我一些只要你认真看就能看到的问题
另外,我建议大家不要对电驴代码的具体实现太执着了,吸取他里面你需要的就行了,否着你就直接把他的界面部分改成一个服务,你直接调用就得了,在短时间内想写的比他好那不现实,尽管他实现的也不是很完美
eMule有很多的变种,官方原版的那个是所有MOD的亲生父母,但下载下来以后还需要自己补上
几个eMule用到的第三方库,veryCD版的eMule我是不推荐的,emuleXtreme这个MOD下载速度各方面
表现不错。不过我用的是eMulevMorphXTv,这个是和官方原版同步更新比较即时的一个MOD.
闲话少说,我今天来为大家点出eMule最核心的一个源码文件
class CPartFile
这个类的作用在eMule里是抗霸子一类的。
首先来看他的头文件
enum EPartFileStatus{
PS_READY = 0,
PS_EMPTY = 1,
PS_WAITINGFORHASH = 2,
PS_HASHING = 3,
PS_ERROR = 4,
PS_INSUFFICIENT = 5,
PS_UNKNOWN = 6,
PS_PAUSED = 7,
PS_COMPLETING = 8,
PS_COMPLETE = 9
};
这是文件状态准备等待被HASH HASH过程中
#define BUFFER_TIME_LIMIT 60000 // Max milliseconds before forcing a flush
这是他回写硬盘的最大时间间隔
struct Requested_Block_Struct
{
uint64 StartOffset;
uint64 EndOffset;
uchar FileID[16];
uint64 transferred; // Barry - This counts bytes completed
};
这个很重要,是他的请求块结构
struct Gap_Struct
{
uint64 start;
uint64 end;
};
这是他的坑结构
struct PartFileBufferedData
{
BYTE *data; // Barry - This is the data to be written
uint64 start; // Barry - This is the start offset of the data
uint64 end; // Barry - This is the end offset of the data
Requested_Block_Struct *block; // Barry - This is the requested block that this data relates to
};
这是缓冲区结构
struct FlushDone_Struct
{
bool bIncreasedFile;
bool bForceICH;
bool* changedPart;
};
刷新完成
struct PartfileSourceCache
{
uint16 nPort;
uint32 dwID;
uint32 dwServerIP;
uint16 nServerPort;
uchar achUserHash[16];
uint8 byCryptOptions;
bool withuserhash;
bool ed2kIDFlag;
ESourceFrom sourcefrom;
uint32 expires;
};
文件源节点缓冲
#define SOURCECACHEPROCESSLOOP MIN2MS(1) //every one minute把1分转成毫秒值
#define SOURCECACHELIFETIME MIN2MS(30) //expires after 30 minutes把30分转成毫秒值