2010-08-01 13 views
3

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. "

Répondre

2

Plate-forme Linux? Basé sur le documentation, vous semblez le faire correctement.

+0

Windows Vista et MinGW avec g ++ version 4.5.0. –

+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? –

+0

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. –