使用 Libtorrent save_state() 保存单个 Torrent?

Posted

技术标签:

【中文标题】使用 Libtorrent save_state() 保存单个 Torrent?【英文标题】:Save Individual Torrents with Libtorrent save_state()? 【发布时间】:2014-10-28 15:11:57 【问题描述】:

我目前正在使用 Ragnar,它是一个 CLI Libtorrent 包装器。

我撞到了一堵砖墙。也许这是我正在使用的包装器的实现缺陷,或者我只是误解了 Libtorrent API 文档,但我无法弄清楚如何正确保存/加载当前的 Session 状态数据。

我目前的目标,我可以最好地说明,是在当前会话中保存所有torrent_handles,这样当我下次运行我正在使用的 torrent 客户端时,我可以在启动时自动加载它们并继续下载/播种。

我仍然不确定是否应该通过保存会话状态来执行此操作。根据API documentation's 的措辞:

传递给 save_state 的 flags 参数可用于过滤要保存的会话状态的哪些部分。默认情况下,所有状态都会保存(单个种子除外)。

但我看不到与 individual torrents 相关的标志:

enum save_state_flags_t

        save_settings =     0x001,
        save_dht_settings = 0x002,
        save_dht_state =    0x004,
        save_proxy =        0x008,
        save_i2p_proxy =    0x010,
        save_encryption_settings = 0x020,
        save_as_map =       0x040,
        save_feeds =        0x080
;

此外,包装器目前被硬编码为不接受这些标志:

cli::array<byte>^ Session::SaveState()

    libtorrent::entry entry;
    this->_session->save_state(entry);

    return Utils::GetByteArrayFromLibtorrentEntry(entry);

这应该很容易解决,但我错过了什么吗?我是否试图通过错误的机制进行保存?

【问题讨论】:

【参考方案1】:

libtorrent 不提供保存 torrent 列表的机制。期望您(客户端)将 .torrent 文件保存在磁盘上(因为它们是不可变的),然后在重新启动时重新添加它们。

一个例外是添加磁力链接时,您需要能够将 torrent_handle 转换为实际的 .torrent 文件。这是一个可以做到这一点的 sn-p:

boost::intrusive_ptr<torrent_info const> ti = h.torrent_file();
create_torrent new_torrent(*ti);
std::vector<char> out;
bencode(std::back_inserter(out), new_torrent.generate());
save_file("mytorrent.torrent", out);

但是,也许更好的选择是将 .torrent 文件(或 info-dict)保存为简历数据的一部分。调用save_resume_data() 时,如果您传入save_info_dict 标志,恢复数据将包含您重新启动种子所需的所有内容。即 .torrent 文件的实际副本将保存在简历文件中。

libtorrent 附带的示例只是将 .torrent 文件保存在一个目录中,并在启动时(并定期)扫描该目录,因此文件系统存储了 torrent 列表。一种更有效的方法是将实际的 .torrent 文件与简历数据一起存储在数据库中(例如 sqlite)。

以下是将与 .torrent 文件捆绑在一起的简历数据保存在 sqlite 数据库中的示例。

save_resume.cpp, save_resume.hpp

在加载所有数据库时,数据库可以提高启动效率。将恢复数据与 torrent 捆绑在一起还可以为每个加载的 torrent 节省一次磁盘查找)。

【讨论】:

以上是关于使用 Libtorrent save_state() 保存单个 Torrent?的主要内容,如果未能解决你的问题,请参考以下文章

在 libtorrent 示例中使用 maketorrent

在 MSVS 2013 中使用 libtorrent

使用 BJam 使用 openssl 构建 libtorrent

如何使用 python-libtorrent 下载特定文件

从 libtorrent 中的 url 种子低速下载

使用 libtorrent 对 torrent 下载序列进行优先级排序