2016-09-05 5 views
9

Я пытаюсь подключить dvr, используя boost asio library в ios. Приложение отлично работает в эмуляторе в сети ipv4. Но когда я отправляю приложение на Appstore, Apple отвергает приложение, так как оно не работает в сети ipv6. И я вижу на сайте Apple, что приложение должно поддерживать сеть ipv6. https://developer.apple.com/news/?id=05042016aIOS boost asio connect from ipv6 network

Поэтому я думаю, что проблема возникает в разделе, где я пытаюсь подключиться к DVR с использованием библиотеки boost, где ip-адрес DVR вытащил из DB (жестко закодированный), а ниже - соответствующая часть код.

 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_)); 

метод 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; 
    } 
} 

Так что я запутался, как изменить код выше для работы в сети IPV6. Не удалось найти решение в Интернете.

+1

'resolver_.resolve()' возвращает итератор к списку записей. Ваш код просто использует первую запись. Вы можете найти запись IPv6, если вы перебираете список ... – kenba

+0

Спасибо за ответ, можете ли вы дать мне код ссылки. – CodeDezk

ответ

3

Вы можете перебирать конечными точками, чтобы найти конечную точку IPv6, используя код ниже:

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

Спасибо, я попробую ваш ответ и дам вам знать результат. – CodeDezk

+0

'if (endpoint_iter _-> protocol() == tcp :: v6())' давая мне ошибку no member named .. – CodeDezk

+0

Я заменил выше на 'boost :: asio :: ip :: address addr = endpoint_iter _-> endpoint().адрес(); if (addr.is_v6()) break; ++ endpoint_iter_; ' – CodeDezk