///编辑的不可变项正在运行。尚未可变。
我正在尝试将某些数据放在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 :(得分:0)
没有更多信息很难说。通过在alert_mask
中启用dht记录并记录这些警报,可以更好地了解发生了什么。
例如,也许您正在尝试在DHT节点完成引导之前存储数据。请参见存储库中的example,了解存储前如何等待引导。
如果只有一个节点将您介绍给网络,则该节点也有可能无法完全引导。我建议在会话之间保存DHT状态,以提高您再次加入网络的机会。