Когда я вызываю dht_get_item в 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);
}
}
}
}

0

Решение

Трудно сказать без дополнительной информации. Вы можете лучше понять, что происходит, включив dht, регистрируясь в alert_maskи зарегистрируйте эти оповещения.

Например, возможно, вы пытаетесь сохранить данные до того, как узел DHT завершит загрузку. Увидеть пример в репозитории, как он ожидает начальной загрузки перед сохранением.

Также возможно, что узел не сможет полностью загрузиться, если у вас есть только один узел, чтобы представить вас в сети. Я бы рекомендовал сохранять состояние DHT между сеансами, чтобы повысить ваши шансы снова подключиться к сети.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector