J'ai essayé de définir la durée de vie sur les paquets ICMP en utilisant l'option boost :: asio :: ip :: unicast :: hops (en utilisant Boost 1.43), puis en lisant avec get_option. Get_option obtient 1 indépendamment de ce que j'utilise dans set_optionDéfinition de TTL sur les paquets ICMP sortants?
Et lors de l'inspection des paquets envoyés en utilisant wireshark, le TTL est de 128. Ai-je manqué quelque chose ici? Dois-je utiliser une autre option pour définir le TTL? Est-ce possible à travers Asio?
Cordialement, Peter
Mise à jour 2010-08-01 17:37 UTC: Voici le code que je utilise:
#include <sstream>
#include <stdexcept>
#include <boost/asio.hpp>
class MyClass: public boost::noncopyable
{
public:
MyClass(const char* host):
io(),
resolver(io),
query(boost::asio::ip::icmp::v4(), host, ""),
socket(io, boost::asio::ip::icmp::v4())
{
destination = *resolver.resolve(query);
}
~MyClass()
{
socket.close();
}
void run()
{
const int ttl = 2;
// set TTL ?
const boost::asio::ip::unicast::hops option(ttl);
socket.set_option(option);
boost::asio::ip::unicast::hops op;
socket.get_option(op);
if(op.value() != ttl)
{
std::ostringstream o;
o << "TTL not set properly. Should be " << ttl << " but was set"
" to " << op.value() << '.';
throw std::runtime_error(o.str());
}
}
private:
boost::asio::io_service io;
boost::asio::ip::icmp::resolver resolver;
boost::asio::ip::icmp::resolver::query query;
boost::asio::ip::icmp::socket socket ;
boost::asio::ip::icmp::endpoint destination;
};
#include <iostream>
int main(int argc, char** argv)
{
try
{
if(argc != 2)
{
throw std::invalid_argument("Missing argument. First argument = host");
}
MyClass T(argv[1]);
T.run();
}
catch(const std::exception& e)
{
std::cerr << "Exception: " << e.what() << '\n';
}
}
A partir de ce que je reçois:
« Exception: TTL n'est pas réglé correctement, il doit être 2, mais réglé sur 1. "
Windows Vista et MinGW avec g ++ version 4.5.0. –
votre code compile et fonctionne bien sur mon système, Mac OS 10.6.3, avec boost 1.43. Je devais l'exécuter en tant que root, peut-être que vous devez faire l'équivalent sur Windows? –
Oui, je dois l'exécuter en tant qu'administrateur. Mais je reçois l'exception à propos du paramètre échoué de TTL lors de l'exécution du programme. Donc, c'est un problème de plate-forme alors. Devrait peut-être signaler un bug au bon traqueur de bug. –