Нужен пример использования dht_put_item с libtorrent - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь использовать dht для хранения изменяемых данных с помощью libtorrent.Насколько я понимаю, правильный путь - использовать метод dht_put_item из сессии.Проблема в том, что мне нужно передать функцию обратного вызова, и я не знаю, что я делаю неправильно ... мой код выглядит следующим образом

namespace lt = libtorrent;

//The callback function
void cb(lt::entry& cdentry, boost::array<char,64>& cbarray, boost::uint64_t& cbint, std::string const& cbstring){
    //My stuff here
}

void main(){
    //The session
    lt::session ses;
    //The data I want to insert into DHT
    std::string cadenaStr = "519d818411de49652b4aaf34850321de28bb2dce";        

    //Now I create the keys
    unsigned char seed[32];
    unsigned char public_key[32];
    unsigned char private_key[64];
    unsigned char signature[32];
    ed25519_create_seed(seed);
    ed25519_create_keypair(public_key, private_key, seed);
    ed25519_sign(signature, cadenaStr.c_str(), sizeof(cadenaStr.c_str()), public_key, private_key);

    //How can I use this?, where is the data supposed to go? :|
    ses.dht_put_item(public_key, cb, false);
}

В libtorrent / session_handler.hpp этот методопределяется как

void dht_put_item(boost::array<char, 32> key
    , boost::function<void(entry&, boost::array<char,64>&
    , boost::uint64_t&, std::string const&)> cb
    , std::string salt = std::string());

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вам не хватает пакета настроек для вашего сеанса.

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

Затем вам нужно подождать, пока вы получите сообщение boostrap, ожидая предупреждения.

wait_for_alert(ses, dht_bootstrap_alert::alert_type);

Last,Ваш вызов dht_put_item:

char const* cadenaStr = "519d818411de49652b4aaf34850321de28bb2dce"; 
dht_put_item(public_key, std::bind(&put_string, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, public_key, private_key, cadenaStr));

Вам понадобятся следующие функции:

static alert* wait_for_alert(session* ses, int alert_type)
{
    alert* ret = nullptr;
    bool found = false;
    while (!found)
    {
        ses->wait_for_alert(seconds(5));
        std::vector<alert*> alerts;
        ses->pop_alerts(&alerts);
        for (std::vector<alert*>::iterator i = alerts.begin()
            , end(alerts.end()); i != end; ++i)
        {
            if ((*i)->type() != alert_type)
            {
                continue;
            }
            ret = *i;
            found = true;
        }
    }
    return ret;
}

static void put_string(
    entry& e
    ,boost::array<char, 64>& sig
    ,boost::int64_t& seq
    ,std::string const& salt
    ,boost::array<char, 32> const& pk
    ,boost::array<char, 64> const& sk
    ,char const* str)
{
    using dht::sign_mutable_item;
    if (str != NULL) {
        e = std::string(str);
        std::vector<char> buf;
        bencode(std::back_inserter(buf), e);
        dht::signature sign;
        seq++;
        sign = sign_mutable_item(buf, salt, dht::sequence_number(seq)
            , dht::public_key(pk.data())
            , dht::secret_key(sk.data()));
        sig = sign.bytes;
    }
}
0 голосов
/ 16 сентября 2018

В репозитории libtorrent есть пример, который я использую для тестирования.Он может генерировать ключи, помещать и получать как изменяемые, так и неизменяемые элементы.

https://github.com/arvidn/libtorrent/blob/master/tools/dht_put.cpp

Как я могу это использовать ?, куда должны идти данные?: |

Вы предоставляете данные в обратном вызове, который вызывается.Причиной такого вида API является то, что существуют случаи, когда вы хотите мутировать данных, а затем вам нужно сначала узнать, что-то уже сохранено под этим ключом, и что это такое.

...