如果torrent包含多个文件,如何知道每个文件对应哪一块?

If torrent contain multiple files, how to know what piece correspond to each file?

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

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

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

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

你做的和我的差不多...

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

1.yes;没有

多文件模式下的信息

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

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

单文件模式下的信息

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

文件名包含文件名。

2.maybe;

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

对等线协议 (TCP)

:

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

index:指定zero-based片索引的整数

begin: 指定zero-based字节偏移量的整数

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

为了 multi-file 案例 中的片段边界,将文件数据视为一个长的连续流,由每个文件按照文件列表中列出的顺序串联而成。然后以与单个文件的情况相同的方式确定片段的数量和它们的边界。片段可能与文件边界重叠。

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

Can torrent contain folders? recursively?

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

If a torrent contains n files (not directories - for simplicity), do I need to create n files with their corresponding size? When I receive a piece from a peer, how do I know to which file it (the piece) belong?

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