Установка TTL для исходящих ICMP-пакетов? - PullRequest
3 голосов
/ 01 августа 2010

Я пытался установить TTL для пакетов ICMP, используя опцию boost :: asio :: ip :: unicast :: hops (используя Boost 1.43), а затем считал его с помощью get_option.

get_optionполучает 1 независимо от того, что я использую в set_option.А при проверке пакетов, отправляемых с помощью wireshark, TTL равен 128. Я что-то здесь упускаю?Должен ли я использовать другую опцию, чтобы установить TTL?Это вообще возможно через Asio?

С уважением, Питер

Обновление 2010-08-01 17:37 UTC: Вот код, который я использую:

#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';
   }
}

Из этого я получаю:

"Исключение: TTL не установлен должным образом. Должно быть 2, но было установлено на 1."

1 Ответ

2 голосов
/ 01 августа 2010

платформа Linux?На основании документации вы, похоже, делаете это правильно.

...