boost::asio設定同步連線超時

double2li發表於2014-06-13

boost::asio設定同步連線超時

 

CSDN上求助無果,只好用自創的非主流方法了。
asio自帶的例子裡是用deadline_timer的async_wait方法來實現超時的,這種方法需要單獨寫一個回撥函式,不利於把連線和超時封裝到單個函式裡。傳統的Winsock程式設計可以先把socket設為非阻塞,然後connect,再用select來判斷超時,asio也可以這樣做,唯一“非主流”的是asio裡沒有一個類似select的函式,所以得呼叫原始的Winsock API,也就犧牲了跨平臺:

  1. #include <iostream>  
  2. #include <boost/asio.hpp>  
  3.    
  4. int main()  
  5. {  
  6.     boost::asio::io_service ios;  
  7.     boost::asio::ip::tcp::socket s(ios);  
  8.     boost::system::error_code ec;  
  9.    
  10.     s.open(boost::asio::ip::tcp::v4());  
  11.     // 設為非阻塞  
  12.     s.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));  
  13.     // connect時必須指定error_code引數,否則會有異常丟擲  
  14.     s.connect(  
  15.         boost::asio::ip::tcp::endpoint(  
  16.         boost::asio::ip::address::from_string(“192.168.1.1”), 80)  
  17.         , ec);  
  18.     fd_set fdWrite;  
  19.     FD_ZERO(&fdWrite);  
  20.     FD_SET(s.native(), &fdWrite);  
  21.     timeval tv = {5};    // 5秒超時  
  22.     if (select(0, NULL, &fdWrite, NULL, &tv) <= 0   
  23.         || !FD_ISSET(s.native(), &fdWrite))  
  24.     {  
  25.         std::cout << “超時/出錯啦” << std::endl;  
  26.         s.close();  
  27.         return 0;  
  28.     }  
  29.     // 設回阻塞  
  30.     s.io_control(boost::asio::ip::tcp::socket::non_blocking_io(false));  
  31.     std::cout << “連線成功” << std::endl;  
  32.     s.close();  
  33.    
  34.     return 0;  

 


相關文章