当我在libtorrent上调用dht_get_item时,警报提示该项目未初始化

时间:2018-09-17 06:45:29

标签: c++ dht libtorrent

///编辑的不可变项正在运行。尚未可变。

我正在尝试将某些数据放在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);      
        }
     }
   }
 }

1 个答案:

答案 0 :(得分:0)

没有更多信息很难说。通过在alert_mask中启用dht记录并记录这些警报,可以更好地了解发生了什么。

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

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