【问题标题】:If torrent contain multiple files, how to know what piece correspond to each file?如果 torrent 包含多个文件,如何知道每个文件对应的是哪一段?
【发布时间】:2018-03-20 21:01:53
【问题描述】:

我正在用 Java 构建一个 BitTorrent 客户端应用程序,我有两个小问题:

  1. torrent 可以包含文件夹吗?递归?
  2. 如果 torrent 包含 n 文件(不是目录 - 为简单起见),我是否需要创建具有相应大小的 n 文件?当我收到来自同行的片段时,我如何知道它(片段)属于哪个文件?

例如,这是一个包含 2 个文件的种子:

TorrentInfo{Created By: ruTorrent (PHP Class - Adrien Gibrat)
Main tracker: http://tracker.hebits.net:35777/tracker.php?do=announce&passkey=5d3ab309eda55c1e7183975099958ab2
Comment: null
Info_hash: c504216ca4a113d26f023a10a1249ca3a6217997
Name: Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH
Piece Length: 16777216
Pieces: 787
Total Size: null
Is Single File Torrent: false
File List:
TorrentFile{fileLength=13202048630, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.mkv]}
TorrentFile{fileLength=62543, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.srt]}

文档不多说:https://wiki.theory.org/index.php/BitTorrentSpecification

【问题讨论】:

    标签: bittorrent


    【解决方案1】:

    你做的和我的差不多……

    以下粗体字体对您的问题很重要。

    1.是的;没有

    多文件模式下的信息

    name:存储所有文件的目录的名称。这纯粹是建议性的。 (字符串)

    路径:包含一个或多个字符串元素的列表,这些元素共同表示路径和文件名。列表中的每个元素对应于一个目录名或(在最后一个元素的情况下)文件名。例如,文件“dir1/dir2/file.ext”将包含三个字符串元素:“dir1”、“dir2”和“file.ext”。这被编码为字符串的编码列表,例如 l4:*dir*14:*dir*28:file.exte

    单文件模式下的信息

    名称:文件名。这纯粹是建议性的。 (字符串)

    文件名包括floder名称。

    2.也许;

    是否需要创建 n 个对应大小的文件,取决于是否需要下载 n 个文件。

    对等线协议 (TCP)

    件:

    片段消息是可变长度的,其中 X 是块的长度。有效载荷包含以下信息:

    index:整数,指定从零开始的片段索引

    开始:整数,指定片段内从零开始的字节偏移量

    block:数据块,是index指定的分片的子集。

    出于多文件情况中的片段边界的目的,将文件数据视为一个长连续流,由每个文件的串联组成按照文件列表中列出的顺序。然后以与单个文件的情况相同的方式确定片段的数量及其边界。碎片可能与文件边界重叠。

    对不起我的英语,因为我不是母语...

    【讨论】:

    • 感谢您的出色回答。我没有机会调查它。但我肯定会很快做。再次感谢您提供如此详细的答案。
    【解决方案2】:

    torrent 可以包含文件夹吗?递归?

    是的。
    有点。在 BEP3 中,嵌套目录映射到路径元素,即 /dir1/dir2/dir3/file.ext 在文件列表中表示为路径:["dir1", "dir2", "dir3", "file.ext"]。 BEP52 将其更改为更类似于目录树的基于树的结构。

    如果一个 torrent 包含 n 个文件(不是目录 - 为简单起见),我是否需要创建 n 个具有相应大小的文件?当我收到来自同行的一个片段时,我如何知道它(该片段)属于哪个文件?

    bittorrent 有线协议处理一个连续的字节地址空间,这些字节被分组为固定大小的片段。客户端如何在本地存储这些字节原则上取决于实现。但是如果你想将它存储在.torrent 中描述的文件布局中,那么你必须计算片段地址空间和文件偏移量之间的映射。在 BEP3 中,文件不与片段边界对齐,因此单个片段可以跨越多个文件。 BEP 47 和 BEP 52 旨在通过分别引入填充文件或隐式对齐间隙来简化这一点。

    【讨论】:

    • 我想我不明白你的意思或者我的问题不清楚,所以我会再问一次。如果种子包含多个文件,当我收到一个包含以下详细信息的片段时:index: x、offset: y 和bytes: z,收到的片段属于哪个文件?
    • 从 BEP3 开始,您可以按片段大小进行多重索引,添加偏移量并将其放在片段地址空间中,然后在文件中查找位置,就好像它们按照 torrent 中列出的顺序连接一样.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多