1. 使用 io_service::work 实现 io_service 无任务时不退出

正常情况下向io_service抛任务,它执行完成后就会自动退出,而要实现那种chromium那种的循环队列,没有任务就等待任务的效果,可以使用io_service初始化一个 io_service::work ,只要这个work没有被析构,那么service就不会主动结束。

但是在要销毁service时,要想让它完全退出,需要先将work销毁,再等待service内还在执行的任务执行完成,service才能完全结束。

写asio程序最容易碰到的就是程序无法结束,根源就在于使用的io_service一直没有结束。未超时的timer、还在活跃中的socket等,都需要手动结束或释放,service才能正常退出。

2.指定网卡加入组播

服务端:

asio::ip::udp::endpoint listenEndpoint(asio::ip::udp::v4(), _multiCastPort);
_listenSocket.open(listenEndpoint.protocol()); _listenSocket.set_option(asio::ip::udp::socket::reuse_address(true));
_listenSocket.set_option(asio::ip::multicast::enable_loopback(true));
//绑定网卡,加入组播组
asio::ip::udp::endpoint localEndpoint(asio::ip::address_v4::from_string(_interfaceIp), _multiCastPort);
asio::ip::udp::endpoint multiCastEndpoint(asio::ip::address_v4::from_string(_multiCastIp), _multiCastPort);
_listenSocket.set_option(asio::ip::multicast::join_group(
multiCastEndpoint.address().to_v4(), localEndpoint.address().to_v4()));

发送端:

// 绑定网卡地址
asio::ip::address_v4 local_interface =
asio::ip::address_v4::from_string(_interfaceIp);
asio::ip::multicast::outbound_interface option(local_interface); sendSocket->set_option(option);

3. async_send_to等异步操作最好自己保留现场

这些异步操作很可能会在你当前对象已经被销毁的情况回调,从而导致空指针错误。要避免这种问题,就是尽量在回调中不用this指针,也就是不用对象的普通成员函数和变量。需要的数据可以使用shared_ptr等智能指针或者直接值拷贝的方式传递到回调函数中。当然如果你能保证你的所有异步回调都会在对象释放前执行,那就可以不用这么干。

4. 不依赖boost使用asio

asio可以脱离boost单独使用,需要设置ASIO_STANDALONE宏。

待续...

ASIO库使用注意事项的更多相关文章

  1. VS2008下编译BOOST 1.39的ASIO库

    由于全部编译BOOST库需要的时间太长,而且耗费空间,况且我只需要用ASIO库,所以就没有必要全部编译了. boost库到www.boost.org上下载. 编译很简单,假设你的boost存放的目录是 ...

  2. php下安装动态扩展库的相关事项

    php下安装动态扩展库的相关事项 我下载的Apache版本为2.4,PHP版本为7.0. 将Apache与PHP集成配置好后(PHP安装目录为:G:\computer\web\php7,apache安 ...

  3. c++ boost asio库初学习

    前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...

  4. C++ 之 Asio 库

    1  简介  Asio 是一个跨平台的 C++ 库,常用于网络编程.底层的 I/O 编程等 (low-level I/O),其结构框架如下: 2  使用 Asio 2.1  下载  Asio 可分为 ...

  5. 在mpvue框架中使用Vant WeappUI组件库的注意事项

    1如何引入组件库 有两种方法 1 npm下载 2 下载代码,下面介绍第二种方法. 在gitHub上, 链接如下 https://github.com/youzan/vant-weapp 首先在自己项目 ...

  6. C#调用C库的注意事项

    作者:朱金灿 来源:http://blog.csdn.net/clever101 注意事项一: 从C#的exe进入C库的源码进行调试,需要先"启用非托管代码调试",如下图: 注意事 ...

  7. Mac OS 使用asio库

    下载地址:http://sourceforge.net/projects/asio/files/asio/1.12.2%20%28Stable%29/ 本人下载的版本:asio-1.12.2 1,本人 ...

  8. Mac OS 安装 独立的asio库

    先安装boost,见前文,然后上官网下载不带boost的asio,版本为:asio-1.12.2 cd到下载的库目录,配置 ./configure --with-boost="boost的安 ...

  9. ServiceStack.Redis客户端访问库几项事项

    1)RedisClient的SetValue(string key, byte[]val)方法,如果val的长度为0,则redis服务器库中设置该key值失败. 2)PoolRedisClientMa ...

随机推荐

  1. web之ics-06

    打开网址,四处点击,点到报表中心,跳转新页面 查看源码也没有什么特别的,发现URL栏有?id=1 以为是sql注入,但是并不是,查看大佬的wp 发现这题采用brupsuite爆破 先将抓到的包放到In ...

  2. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

  3. boostrap --- 弹窗modal的使用

    <input id="btntext" type="button" value="添加文本组件" data-toggle=" ...

  4. git 入门教程之 git bash 竟然不支持 tree 命令

    开门见山 git bash 是 Windows 用户安装 git 时默认安装的命令行工具,不仅界面漂亮功能也不错,大多数情况下可以替代 Windows 原生的 cmd 命令行. 然而,git bash ...

  5. ajax技术初识与应用

    一.ajax技术初识 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编 ...

  6. 【新特性速递】树控件结构由单层 TR 改为 TR-TD-TABLE 层级嵌套

    FineUIPro/Mvc/Core的下个版本(v6.1.0),我们对树控件进行了优化,由原来的单层 TR 改为 TR-TD-TABLE 层级嵌套,从而做到表里如一. 上个版本(v6.0.0),我们对 ...

  7. ABP AOP 用例

    介绍 在本文中,我将向您展示如何创建拦截器来实现AOP技术.我将使用ASP.NET Boilerplate(ABP)作为基础应用程序框架和Castle Windsor作为拦截库.这里描述的大多数技术对 ...

  8. spring tomcat启动 请求处理

    onRefresh(); protected void onRefresh() { try { createEmbeddedServletContainer(); } } private void c ...

  9. matplotlib画预测框以及打标签

    https://blog.csdn.net/weixin_43338538/article/details/89003280 https://blog.csdn.net/yjl9122/article ...

  10. vuex 源码分析(七) module和namespaced 详解

    当项目非常大时,如果所有的状态都集中放到一个对象中,store 对象就有可能变得相当臃肿. 为了解决这个问题,Vuex允许我们将 store 分割成模块(module).每个模块拥有自己的 state ...