2010-08-01 3 views
3

boost :: asio :: ip :: unicast :: hops 옵션 (Boost 1.43 사용)을 사용하여 ICMP 패킷에 TTL을 설정하고 get_option으로 읽으려고 시도했습니다.보내는 ICMP 패킷에 TTL을 설정 하시겠습니까?

get_option은 set_option에서 사용하는 것과 관계없이 1을 얻습니다. 그리고 wireshark를 사용하여 패킷을 검사 할 때 TTL은 128입니다. 여기에 뭔가 빠졌습니까? 다른 옵션을 사용하여 TTL을 설정해야합니까? Asio를 통해 가능한가요?

감사합니다, 피터

업데이트 2010-08-01 세계 협정시 17시 37분 : 여기 내가 사용하고 코드입니다 :이에서

#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로 설정되어야합니다. "

답변

2

Linux 플랫폼? documentation을 기반으로 올바르게 수행하는 것으로 보입니다.

+0

g ++ 버전 4.5.0 인 Windows Vista 및 MinGW. –

+0

당신의 코드는 내 시스템 인 Mac OS 10.6.3에서 부스트 1.43으로 컴파일되어 잘 실행됩니다. 루트로 실행해야했는데 Windows에서 해당 기능을 수행해야합니까? –

+0

예, 관리자로 실행해야합니다. 그러나 프로그램을 실행할 때 실패한 TTL 설정에 대한 예외를 얻습니다. 그래서 이것은 플랫폼 문제입니다. 아마도 적절한 버그 추적기에 버그를보고해야합니다. –

관련 문제