ASIO库使用注意事项
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库使用注意事项的更多相关文章
- VS2008下编译BOOST 1.39的ASIO库
由于全部编译BOOST库需要的时间太长,而且耗费空间,况且我只需要用ASIO库,所以就没有必要全部编译了. boost库到www.boost.org上下载. 编译很简单,假设你的boost存放的目录是 ...
- php下安装动态扩展库的相关事项
php下安装动态扩展库的相关事项 我下载的Apache版本为2.4,PHP版本为7.0. 将Apache与PHP集成配置好后(PHP安装目录为:G:\computer\web\php7,apache安 ...
- c++ boost asio库初学习
前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...
- C++ 之 Asio 库
1 简介 Asio 是一个跨平台的 C++ 库,常用于网络编程.底层的 I/O 编程等 (low-level I/O),其结构框架如下: 2 使用 Asio 2.1 下载 Asio 可分为 ...
- 在mpvue框架中使用Vant WeappUI组件库的注意事项
1如何引入组件库 有两种方法 1 npm下载 2 下载代码,下面介绍第二种方法. 在gitHub上, 链接如下 https://github.com/youzan/vant-weapp 首先在自己项目 ...
- C#调用C库的注意事项
作者:朱金灿 来源:http://blog.csdn.net/clever101 注意事项一: 从C#的exe进入C库的源码进行调试,需要先"启用非托管代码调试",如下图: 注意事 ...
- Mac OS 使用asio库
下载地址:http://sourceforge.net/projects/asio/files/asio/1.12.2%20%28Stable%29/ 本人下载的版本:asio-1.12.2 1,本人 ...
- Mac OS 安装 独立的asio库
先安装boost,见前文,然后上官网下载不带boost的asio,版本为:asio-1.12.2 cd到下载的库目录,配置 ./configure --with-boost="boost的安 ...
- ServiceStack.Redis客户端访问库几项事项
1)RedisClient的SetValue(string key, byte[]val)方法,如果val的长度为0,则redis服务器库中设置该key值失败. 2)PoolRedisClientMa ...
随机推荐
- oracle 周岁年龄计算
以下三种方法均可实现周岁年龄的计算: --算法一: SELECT TRUNC(months_between(sysdate, csrq)/12) AS "Age" FROM wrx ...
- PKCS pfx cer x509
PKCS pfx cer x509 参考 PKCS 15 个标准 PKCS The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙 ...
- 零基础入门 实战mpvue2.0多端小程序框架
第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...
- 【2019.8.8 慈溪模拟赛 T2】query(query)(分治+分类讨论)
分治 首先,我们考虑分治处理此问题. 每次处理区间\([l,r]\)时,我们先处理完\([l,mid]\)和\([mid+1,r]\)两个区间的答案,然后我们再考虑计算左区间与右区间之间的答案. 处理 ...
- 解决WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
问题: 当我想要利用win10本地的cmd进行: ssh root@192.168.1.230 时,出现了如下错误: C:\Users\Raodi>ssh root@192.168.1.230 ...
- Jenkins安装第一个插件和通过离线安装包进行安装
1.打开左侧Manage Jenkins 选择Manage Plugins菜单 2.搜索Folders插件,该插件用于创建一个目录 3.点击安装进入插件安装状态,Jenkins会自动下载相关联的插件 ...
- LeetCode 328:奇偶链表 Odd Even Linked List
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1), ...
- mysql id 自增实现
1.在mysql中建表 2.使用: >insert into 表名 values(id,'www',66); 连续运行5次后结果: =============================== ...
- Gin框架 - 使用 Logrus 进行日志记录
概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirupsen/logrus. Logrus is a st ...
- 修改Hexo自动生成的HTML文件名
导读 我们在使用Hexo框架生成静态博客时,其实是将你写好的.md文件输出成HTML文件进行渲染,其中HTML的文件名称就是.md的文件名称. 而我们为了编辑文章方便,为了通过文件名就知道这是哪篇文章 ...