• boost::asio设置同步连接超时


    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;  
  • 相关阅读:
    GO语言常用标准库03---time包
    GO语言常用标准库02---os包
    GO语言常用标准库01---strings包
    GO语言复合类型05---递归
    GO语言练习---对切片进行排序
    GO语言复合类型04---映射
    GO语言复合类型03---切片
    GO语言复合类型02---数组
    [踩坑记录] windows10 应用商店打不开 代码: 0x80131500
    [Linux kali] Kali KDE桌面安装中文输入法 不能登录系统
  • 原文地址:https://www.cnblogs.com/lidabo/p/3785809.html
Copyright © 2020-2023  润新知