使用Libtorrent Save_state()保存个人洪流

本文关键字:保存 洪流 Libtorrent Save state 使用 | 更新日期: 2023-09-27 18:28:18

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

我撞到了砖墙。也许这是我使用的包装器的实现缺陷,或者我只是误解了Libtorrent API文档,但我不知道如何正确保存/加载当前会话状态数据。

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

我仍然不确定是否应该通过保存会话状态来完成此操作。根据API文件的措辞:

传递给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);
}

这应该很容易修复,但我遗漏了什么吗?我是否试图通过错误的机制进行储蓄?

使用Libtorrent Save_state()保存个人洪流

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

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

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所需的所有内容。即.torrent文件的实际副本将被保存在简历文件中。

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

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

save_resume.cpp、save_resumer.hpp

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