2016-09-05 21 views
9

Próbuję podłączyć dvr używając doładowania biblioteki asio w ios. Aplikacja działa dobrze w emulatorze z siecią ipv4. Ale kiedy przesłać aplikację na Appstore Apple odrzucił aplikację, ponieważ nie działa w sieci ipv6. I widzę na stronie Apple, że aplikacja powinna obsługiwać sieć ipv6. https://developer.apple.com/news/?id=05042016aIOS boost asio połączenie z sieci ipv6

Więc myślę, że problem pojawia się w sekcji, w której próbuję połączyć się z DVR za pomocą biblioteki boost, gdzie adres IP rejestratora jest wyciągany z DB (zakodowany na stałe), a poniżej znajduje się odpowiednia część kod.

 boost::asio::io_service io_service_; 
     tcp::resolver::iterator endpoint_iter_; 
     tcp::resolver resolver_; //to healp resolving hostname and ip 

     stringstream strstream;//create a stringstream 
     strstream << port;//add number to the stream 

     endpoint_iter_ = resolver_.resolve(tcp::resolver::query(ip.c_str(),strstream.str())); 
     start_connect(endpoint_iter_); 

     // Start the deadline actor. You will note that we're not setting any 
     // particular deadline here. Instead, the connect and input actors will 
     // update the deadline prior to each asynchronous operation. 
     deadline_timer_.async_wait(boost::bind(&dvr_obj::check_deadline, this)); 
     //starting thread for dvr connection 
     io_service_.reset(); 
     thread_ = new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_)); 

metoda start_connect

void start_connect(tcp::resolver::iterator endpoint_iter) 
{ 
    try 
    { 
     if (endpoint_iter != tcp::resolver::iterator()) 
     { 

      drill_debug_info("trying to connect %s \n",name.c_str()); 

      // Set a deadline for the connect operation. 
      deadline_timer_.expires_from_now(boost::posix_time::seconds(10)); 

      // Start the asynchronous connect operation. 
      socket_.async_connect(endpoint_iter->endpoint(), 
            boost::bind(&dvr_obj::handle_connect, 
               this, _1, endpoint_iter)); 
     } 
     else 
     { 
      // There are no more endpoints to try. Shut down the client. 

      connectivity = false; 
     } 
    } catch (int e) { 

     connectivity = false; 
    } 
} 

Więc jestem zdezorientowany jak zmienić powyższy kod do pracy w sieci IPv6. Nie można znaleźć żadnego rozwiązania w Internecie.

+1

'resolver_.resolve()' zwraca iterator do listy zgłoszeń. Twój kod używa tylko pierwszego wpisu. Możesz znaleźć wpis IPv6, jeśli przejrzysz listę ... – kenba

+0

Dzięki za odpowiedź, możesz podać mi jakiś kod referencyjny. – CodeDezk

Odpowiedz

3

Można iterację punktów końcowych, aby znaleźć punkt końcowy IPv6 za pomocą poniższego kodu:

endpoint_iter_ = resolver_.resolve(tcp::resolver::query(ip.c_str(),strstream.str())); 

while (endpoint_iter_ != tcp::resolver::iterator()) 
{ 
    if (endpoint_iter_->endpoint().protocol() == tcp::v6()) 
    break; 
    ++endpoint_iter_; 
} 

if (endpoint_iter_ != tcp::resolver::iterator()) 
{ 
    start_connect(endpoint_iter_); 
    ... 
} 
else 
    std::cerr << "IPv6 host not found" << std::endl; 
+0

Dzięki, spróbuję twojej odpowiedzi i dam znać wynik. – CodeDezk

+0

'if (endpoint_iter _-> protocol() == tcp :: v6())' podając mi błąd nr członka o nazwie .. – CodeDezk

+0

Zastąpiłem powyższe słowem 'boost :: asio :: ip :: address addr = endpoint_iter _-> endpoint().adres(); jeśli (addr.is_v6()) przerwa; ++ endpoint_iter_; ' – CodeDezk

Powiązane problemy