2014-02-14 46 views
1

我正在使用Boost Asio進行跨平臺聯網。我嘗試了各種連接方法,並在嘗試連接到Android上的套接字時不斷收到「Element not found」asio.misc錯誤。我很困惑,因爲這是在成功解析域名後發生的。例如,如果我爲主機和端口80輸入google.com,那麼解析器將打印出所有20個以上的Google服務器,但之後它將不會連接說asio.misc「找不到元素」加速Android Asio連接錯誤

這是我的代碼:

boost::asio::io_service service; 
    boost::system::error_code ec; 
    boost::asio::ip::tcp::resolver resolver(service); 
    boost::asio::ip::tcp::resolver::query query(host, port); 
    boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query, ec); 
    boost::asio::ip::tcp::resolver::iterator iterEnd; 
    boost::asio::ip::tcp::endpoint ep; 
    int it = 0; 
    while(iter != iterEnd) 
    { 
     ep = *iter++; 
     debug+="\nLooking at resolve with address " + ep.address().to_string(); 
     it++; 
    } 

     //Try to connect through asio 
     boost::asio::ip::tcp::socket sock(service); 
     //asio::connect does all the iterator work for us. 
     boost::asio::connect(sock, iter, ec); 

     if(ec) 
     { 
      return new string("Should be connected but I can't"); 
     } 
     else 
     { 
      debug+= "\n  " + ec.message() + "\n  " + ec.category().name(); 
      return debug; 
     } 
+0

你有訪問互聯網所需的權限? – sehe

+0

是的,我願意。它將域名解析爲正確的IP地址,所以我知道我設置了它。 – Theopile

+0

你打電話給'服務'? ** post()**或** bind()**。 –

回答

3

調試循環耗盡迭代器,導致boost::asio::connect()與末端迭代器一起被調用。

boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query, ec); 

while(iter != iterEnd) // iterate to exhaustion 
{ 
    ep = *iter++; 
    // ...  
} 

// ... 
boost::asio::connect(sock, iter, ec); // use exhausted iterator 

要解決這個問題,通過改變建立在調試信息考慮迭代的iter副本:

while(iter != iterEnd) 
{ 
    ep = *iter++; 
    // ...  
} 

到:

for(tcp::resolver::iterator i = iter, end; i != end; ++i) 
{ 
    ep = *i; 
    // ... 
} 

下面是一個完整示例基於大致基於原始代碼,它演示了差異:

#include <iostream> 
#include <boost/asio.hpp> 

void connect(const char* address, const char* port, bool exhaust) 
{ 
    using boost::asio::ip::tcp; 

    boost::asio::io_service io_service; 
    tcp::resolver resolver(io_service); 
    tcp::resolver::iterator iterator = resolver.resolve(
     tcp::resolver::query(address, port)); 

    // If flag is set, exhaust the iterator. 
    if (exhaust) 
    { 
    std::cout << "Exhausting iterator" << std::endl; 
    for (tcp::resolver::iterator end; iterator != end; ++iterator) {} 
    } 
    // Otherwise, exhaust a copy of the iterator. 
    else 
    { 
    std::cout << "Exhausting copy of iterator" << std::endl; 
    for (tcp::resolver::iterator i = iterator, end; i != end; ++i) {} 
    } 

    tcp::socket socket(io_service); 
    boost::system::error_code error; 
    connect(socket, iterator, error); 
    std::cout << error.category().name() << " -- " 
      << error.message() << std::endl; 
} 

int main() 
{ 
    connect("google.com", "80", true); // exhaust 
    connect("google.com", "80", false); // do not exhaust 
} 

將會產生以下的輸出:

Exhausting iterator 
asio.misc -- Element not found 
Exhausting copy of iterator 
system -- Success 
+0

這很有效,迭代的方式看起來很奇怪,但它在他們的網站上,在幾個參考文獻中,並在iOS中工作。謝謝! – Theopile