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 ...
随机推荐
- Centos 7 编译安装mariadb 5.5
一.环境 OS :Linux 3.10.0-693.el7.x86_64 mariadb下载地址: ]# wget https://downloads.mariadb.org/interstitial ...
- python 连接oracle -- sqlalchemy及cx_Oracle的使用详解
python连接oracle -- sqlalchemy import cx_Oracle as orcl import pandas as pd from sqlalchemy import cre ...
- python27期python连接数据库:
import pymysql创建connectinon对象:con = pymysql.connect(host = "localhost",user = "root&q ...
- LG4170/BZOJ1260 「CQOI2007」涂色 区间DP
区间DP 发现可以转化为区间包含转移. 考虑区间\([l,r]\),分为两种情况. \(col[l]=col[r]\) 此时相当于在涂\([l,r-1]\)或\([l+1,r]\)顺带着涂掉 \[f( ...
- [题解向] CF#536Div2の题解 E&F
\(0x01~~Preface\) \(emmm\)这次CF本身打的很顺畅,但是居然unrated了--咕咕咕咕 这是头一次CF有比赛我全部题目都做了--可喜可贺可喜可贺233 简单总结一下前面四道题 ...
- Note | MATLAB
目录 1. 读写文件 简单读写 将rgb保存为yuv文件 从yuv文件中读取Y通道 将TIFF图片拼接为yuv文件 2. 字符串操作 3. 画图 4. 词频统计 1. 读写文件 简单读写 fp = f ...
- es6中reduce()方法和reduceRight()方法
es6中reduce()方法从左往右开始 参数:prev:它是上一次调用回调时返回的结果,每次调用的结果都会给prev cur:当前的元素 index:当前的索引 arr:循环的数组 返回值:函数累计 ...
- 小米笔记本pro 黑苹果系统无法进入系统,频繁重启故障解决记录
问题1:频繁重启,然后clover丢失 表现情况:开机没有选择macos 或windos的界面 解决办法:进入windows使用工具easyefi,直接添加一个clover start boot,选择 ...
- 解决python 缺少os.fspath
在python3.6下运行pandas会报错缺少os.fspath 升级到python3.7 3.7 安装参考:https://www.cnblogs.com/jifeng/p/11221469.ht ...
- linux 文件详细信息
权限列: 权限列中一共 10 个字符,第一个字符代表文件类型,后边9 个字符 3 个为一组表示不同用户的权限: 第一字符表示文件类型: [d]:目录 [-]:普通文件 [l]:连接档 [b]:设备文件 ...