【问题标题】:When I call dht_get_item on libtorrent the alarm says that the item is not initialized当我在 libtorrent 上调用 dht_get_item 时,警报说该项目未初始化
【发布时间】:2019-02-21 01:05:03
【问题描述】:

//已编辑的不可变项正在工作。尚不可变。

我正在尝试将一些数据放在 DHT(可变或不可变)下,但是当我收到带有 get 响应的警报时,消息说该项目未初始化。 我做错了吗?

std::string cadenaStr = "Hello world"; //The string I want to save on DHT
lt::entry data;  // The entry to store the message
data = cadenaStr;
std::vector<char> buf;  //The buffer where the bencoded message will be
lt::bencode(std::back_inserter(buf), data);
lt::sha1_hash hash = ses.dht_put_item(buf);  //Finally I put the bencoded message on DHT

然后我使用 ses.dht_get_item(hash) 并等待该项目的警报,但消息说该项目未初始化。

我在尝试获取可变项目时得到相同的响应。

错在哪里?

非常感谢。

这是成功使用不可变项后的完整代码。可变项仍然不起作用。

namespace lt = libtorrent;

unsigned char signature[64];
unsigned char seed[32];
unsigned char public_key[32];
boost::array<char, 32> key;
unsigned char private_key[64];

void cb(lt::entry& e, boost::array<char,64>& sig, boost::uint64_t& seq, 
std::string const& salt){
    printf("Entrando en callback function\n");
    e = std::string("Hello world from Libtorrent!");
    std::vector<char> buf;
    lt::bencode(std::back_inserter(buf), e);
    ++seq;
    std::pair<char const *, int> pairStr;
    pairStr = std::make_pair(e.to_string().c_str(), 
sizeof(e.to_string().c_str()));
    std::pair<char const *, int> pairSalt;
    pairSalt = std::make_pair(salt.c_str(), sizeof(salt.c_str()));
    lt::dht::sign_mutable_item(pairStr, pairSalt, seq, public_key, 
private_key, signature);
    for(int i=0; i<64; i++)
        sig[i] = signature[i];
}

int main(int argc, char const* argv[])
{
    if (argc != 2) {
        std::cerr << "usage: " << argv[0] << " <magnet-url>" << std::endl;
        return 1;
    }

    ed25519_create_seed(seed);
    ed25519_create_keypair(public_key, private_key, seed);
    for(int i=0;i<32;i++){
        key[i] = public_key[i];
    }

    lt::settings_pack sett;
    sett.set_bool(lt::settings_pack::enable_dht, true);
    sett.set_int(lt::settings_pack::alert_mask, 0xffffffff);
    lt::session ses(sett);
    ses.apply_settings(sett);

    while(!ses.is_dht_running()){
        printf("DHT is not running\r");
    }
    printf("DHT is running\t\t\n");  

    lt::add_torrent_params atp;

    atp.url = argv[1];
    atp.save_path = "."; // save in current dir
    lt::torrent_handle h = ses.add_torrent(atp);

    for (;;) {
        std::vector<lt::alert*> alerts;
        ses.pop_alerts(&alerts);

        for (lt::alert const* a : alerts) {
            if(lt::alert_cast<lt::dht_bootstrap_alert>(a)){
                std::cout << a->message() << std::endl;
                ses.dht_put_item(key, std::bind(&cb, 
 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, 
 std::placeholders::_4), std::string("salt"));
            }
            if(lt::alert_cast<lt::dht_mutable_item_alert>(a)){
                std::cout << a->message() << std::endl;
                lt::dht_mutable_item_alert* item = 
  lt::alert_cast<lt::dht_mutable_item_alert>(a);
                std::string str = item->item.to_string();
                std::printf("%s", str.c_str());  
                printf("Mutable item alert successfull\n");
                exit(0);
            }
            if(lt::alert_cast<lt::dht_put_alert>(a)){
                std::cout << a->message() << std::endl;
            lt::dht_put_alert* item = lt::alert_cast<lt::dht_put_alert>(a);
                int num_success = item->num_success;
                if(num_success==0)
                    ses.dht_put_item(key, std::bind(&cb, 
  std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, 
 std::placeholders::_4), "salt");
                else
                    ses.dht_get_item(key);      
        }
     }
   }
 }

【问题讨论】:

    标签: c++ dht libtorrent


    【解决方案1】:

    没有更多信息很难说。您可以通过在alert_mask 中启用 dht 日志记录来更好地了解正在发生的事情,并记录这些警报。

    例如,您可能正在尝试在 DHT 节点完成引导之前存储数据。请参阅存储库中的example,了解它在存储之前如何等待引导。

    如果您只有一个节点将您介绍给网络,该节点也可能无法完全引导。我建议在会话之间保存 DHT 状态,以提高您再次加入网络的机会。

    【讨论】:

    • 感谢您的帮助。我已经能够放置一个不可变项目并让它正常,但可变项目仍然不起作用。我已经用我正在使用的完整代码编辑了这个问题。再次感谢。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多