首页 | 社区 | 乐铺 | 电驴 | 网页游戏 | 网址大全

相关主题

正在读取……

主题: Emule协议规范的一个不明白的地方

相关分类:

isnoopy (楼主) 2008/04/30 10:54:14 顶楼 举报

最近看 Emule协议有个不明白的地方,就是关于客户端文件请求的,规范中是这么写的:

6.4.14文件请求
从向其他客户端请求文件的客户端发送该消息。这个消息包含请求文件的ID和状态字段描
述了,哪个块准备下载。

块状态字段
eMule允许客户端从其它客户端中下载文件块,甚至当提供的客户端还没有完全下载这个请
求的文件。块状态字段帮助区分一个只是不在被请求的客户端上的文件和一个只有部分被下
载的文件。如果,文件不存在,则块字段值为0。如果文件是部分的下载,则头2字节是整数,
给出已经下载的块的数量,而最后字节是位向量,指示哪个文件是完全下载的(通过设置机
器位为1)。
名称 字节大小 默认值 注释
Protocol 1 0xE3
Size 4 消息大小是以字节为单位,不包括头部和大小的域
Type 1 0x58 OP_FILEREQUSET操作码的值
FileID 16 NA 惟一的文件ID
PartStatus 3 NA 可选的,如果eMule信息中的扩展请求版本指示消息大于0,则发送。文件 签名在本章中介绍
Sourcecount 2 NA 可选的,如果eMule信息中的扩展请求版本指示消息大于1,则发送。指示 这个文

我的疑惑在于
1。既然消息包含哪个块准备下载,那么应该对应PartStatus,而如果文件是部分的下载,则头2字节是整数,那么只剩下1字节(8位)来表示要下载的块,对于块数很多的文件明显8位无法表示嘛。

2。对应文件请求回应,是否里面也会有自己块的下载完成情况的信息?如果没有的话,如何让对方得知自己已下载完成的块?

isnoopy (楼主) 2008/04/30 11:23:55 2楼 举报

一个猜想:
是否是当下载的一方A到达上传队列B的顶部时,B发送接受上传请求消息里有记录自己可以共享的块?但是从该消息没有看到这一点啊?
名称 字节大小 默认值 注释
Protocol 1 0xE3
Size 4 消息大小是以字节为单位,不包括头部和大小的域
Type 1 0x55 OP_ACCEPTUPLOADREQ操作码的值

godLaugh (组长) | 文档描述和实际实现不符... 2008/05/04 11:30:00 3楼 举报

1 这个疑问很好,你的质疑是对的!这时候只有看代码来解决了,实现代码中发送的bitmap不是一个Byte的... 是把本地整个的PartStatus的bitmap传输过去的;

具体请看发送方发送 OP_REQUESTFILENAME 的代码
void CUpDownClient::SendFileRequest()
|->CPartFile::WritePartStatus(CSafeMemFile* file)

2 请求方发送 OP_SETREQFILEID 后,应答方发送 OP_FILESTATUS 把自己的PartStatus 的bitmap发送过去;
具体代码请参看:
CClientReqSocket::ProcessPacket()
{
 ...
 case OP_FILESTATUS:
  ....
  client->ProcessFileStatus(false, &data, file);
  ...
}

2008/05/04 11:41:36godLaugh 最后编辑 | 查看全部


返回组首页

快速回复

(?) 附件上传

关于我们 | 诚聘英才 | 著作权声明 | 合作信息 | 广告事务
沪ICP备05001009号
©2003 - 2008 VeryCD.com Some Rights Reserved.