我目前正在使用Ragnar这是一个CLI Libtorrent包装器。
我撞到了一堵砖墙。也许它是我使用的包装器的实现缺陷,或者我只是误解了Libtorrent API文档,但我无法弄清楚如何正确保存/加载当前会话国家数据。
我目前的目标,就是我最好的说法,就是在当前会话中保存所有torrent_handles
,这样当我下次运行我正在处理的torrent客户端时,我可以在启动时自动加载它们恢复下载/播种。
我仍然不确定是否应该通过保存会话状态来执行此操作。根据{{3}}措辞:
传递给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);
}
这应该很容易解决,但我错过了什么吗?我是否试图通过错误的机制进行保存?
答案 0 :(得分:4)
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)。
这是一个将与.torrent文件捆绑在一起的简历数据保存在sqlite数据库中的示例。
save_resume.cpp,save_resume.hpp
数据库在加载所有内容时可以提高启动效率。将恢复数据与torrent一起捆绑还可以为每个加载的torrent保存一个磁盘搜索。