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

简介: boost::asio设置同步连接超时   CSDN上求助无果,只好用自创的非主流方法了。asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写一个回调函数,不利于把连接和超时封装到单个函数里。

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;  

 

目录
相关文章
|
算法 Python
LightGBM高级教程:自动调参与超参数优化
LightGBM高级教程:自动调参与超参数优化【2月更文挑战第5天】
1495 2
|
5月前
|
人工智能 JSON 自然语言处理
我终于成为了全栈开发,各种AI工具加持的全过程记录
本文从一个需求出发,全程记录如何进行全栈开发。
869 51
我终于成为了全栈开发,各种AI工具加持的全过程记录
|
10月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
411 4
|
缓存 NoSQL Linux
Redis(一)Centos7.6安装Redis服务
Centos的yum源中没有redis;这里我们需要安装一个第三方的yum源,这里用了Fedora的epel仓库。
2762 0
Redis(一)Centos7.6安装Redis服务
|
存储 API C++
【 QString接口大全】 Qt QString类使用示例
【 QString接口大全】 Qt QString类使用示例
466 1
|
网络协议 网络安全 开发工具
VMware 虚拟机 - NAT模式下设置静态 IP 地址
VMware 虚拟机 - NAT模式下设置静态 IP 地址
1529 0
VMware 虚拟机 - NAT模式下设置静态 IP 地址
|
存储 Web App开发 网络协议
YUV的plannar,packet及semi-planar格式及RGB
YUV的plannar,packet及semi-planar格式及RGB
388 0
YUV的plannar,packet及semi-planar格式及RGB
|
存储 XML 数据库
《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式
《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式
150 0
|
Linux 图形学 Windows
Linux(入门)---002.desktop文件教程
linux入门 上篇讲过了firefox_dev配置 然而自定义一些软件linux系统不会给你提供桌面快捷方式,原理:由软链接与本章语法有关
730 0