boost相关
1 boost 常用函数
<1> tcp跟udp的收发函数名
tcp收发
async_write
async_read
async_read_until
udp收发
async_send_to
async_receive_from
<2> boost::asio常见的网络错误代码
参考: http://www.cppblog.com/shanoa/archive/2015/03/19/145840.html
- boost::asio::error::bad_descriptor(10009): 在一个已经关闭了的套接字上执行收发操作时, 回调函数会立即被调用, 并且给boost::asio::placeholders::error赋该值
- boost::asio::error::operation_aborted(995): 本地socket主动关闭时, 关联到此socket上的异步回调函数会立即被调用, 并且给boost::asio::placeholders::error赋该值
- boost::asio::error::connection_reset(10054): socket对端发送reset包关闭socket时,关联到此socket上的异步回调函数会立即执行,并且给boost::asio::placeholders::error赋该值
- boost::asio::error::eof(2): socket对端经过4次握手正常关闭连接后, 在此连接上的异步回调函数会立即被调用, 并且给boost::asio::placeholders::error赋该值
- 336130315: 这个值是openssl里定义的,没有对应的枚举值, 这个是在ssl握手的时候, 当ssl设置的版本高于对端支持的最高版本时, 握手回调函数会立即执行, 并且给boost::asio::placeholders::error赋该值
2 boost里面的陷阱
<1>async_write
参考: http://blog.csdn.net/cedricporter/article/details/6915775
最近在做一个网络相关的项目, cs架构的。调试的时候发现, 在client大规模的给server发数据的时候, server会收到乱序的数据。为了定位bug, 在client发往server的消息头里面加入了消息序号字段, 在server, client端分别输出每条消息的头, 内容信息, 以及分别抓包。比较郁闷的是, 发现在server端收到的包里面的消息序号字段有重复的, 进一步跟踪发现, client应用层是没有问题的, 但是到了网络层就出问题了。 看着这个现象, 有点像线程同步的问题, 但加了锁之后依然如此, 没办法了, 只能上网搜索。在我大天朝, google是不能用了, 那就百度吧, 搜索关键字 "async_write" 居然第一条就是我想要的答案, 看来度娘在某些时候还是挺给力的。那篇文章(就是此文最开始的那个链接) 中说的核心意思就是:
async_write在调用底层函数执行发送命令时, 不能保证一次发送完buff中的内容, 只能被告知这次发送了多少字节, 然后再下一次异步发送的时候, 再继续发送。实际上async_write是通过一次或者多次调用async_write_some函数来实现的,那么如果在第一个async_write还没有完成就调用第二个async_write,async_write_some就有可能先将第二个buffer的数据先发送出去。因此, 文中给出的解决方案就是发送完一次msg之后, 在回调函数中再发送下一条消息
<2>关于boost::asio::streambuf与std::istream的一个bug
使用环境: vs2012(update4), boost1.58--boost1.62
bug重现步骤: 在以上环境用c++写了一个server, python写了一个client, 在server端用 boost::asio::streambuf 接收client发来的一段数据是经调试发现是没有问题的, 但用以下语句:std::istream aaa (&boost::asio::streambuf); aaa >>char; 大概在读取了两三个字节后, 数据就出错了, 目前不太清楚是什么原因造成的. 作为对比, 用c++写的client发送数据通过上述步骤后就可以读出正确数据;还有如果直接从boost::asio::streambuf读取数据, 也是没有问题的. 先在此记录下这个bug, 等哪天有空了, 再研究研究...
经测试发现, 在c++写的server接收python client使用以下函数不会出现接收错误问题,
boost::asio::streambuf recvbuf_;
struct header header_;
char *buffer = (char *)(&header_);
recvbuf_.sgetn(buffer,sizeof(struct header));
<3>关于boost::bind与boost::enable_shared_from_this的bug
使用环境: vs2012(update4), boost1.58--boost1.62
当自定义类继承boost::enable_shared_from_this<> ,并且在该类的成员函数里面,使用boost::bind的时候, 对象指针那个参数必须使用shared_from_this(),而不能使用this, 否则有很大几率会出现异常
boost相关的更多相关文章
- boost 相关
编译boost: 1.打开Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prom ...
- 编译用到boost相关的东西,问题的解决;以及和googletest库
编译https://github.com/RAttab/reflect, 发现需要gcc4.7以上的版本才行.于是编译安装最新的gcc-6.2.0, 过程算顺利. http://www.linuxfr ...
- Boost程序库完全开发指南——深入C++“准”标准库(第3版)
内容简介 · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...
- boost function对象
本文根据boost的教程整理. 主要介绍boost function对象的用法. boost function boost function是什么 boost function是一组类和模板组合,用于 ...
- boost 的函数式编程库 Phoenix入门学习
这篇文章是我学习boost phoenix的总结. 序言 Phoenix是一个C++的函数式编程(function programming)库.Phoenix的函数式编程是构建在函数对象上的.因此,了 ...
- Gradient Boost 算法流程分析
我们在很多Gradient Boost相关的论文及分析文章中都可以看到下面的公式: 但是,对这个公式的理解,我一直也是一知半解,最近,终于下决心对其进行了深入理解. 步骤1:可以看作优化目标的损失函数 ...
- 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题
请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...
- Boost 和 Boost.Build 的设置
问题: 安装编译完 Boost 后,如果不设置 BOOST_ROOT 和 BOOST_BUILD_PATH 则可能导致使用 bjam 时定位到 Boost 默认的路径 /usr/share/boost ...
- 比特币源码分析--C++11和boost库的应用
比特币源码分析--C++11和boost库的应用 我们先停下探索比特币源码的步伐,来分析一下C++11和boost库在比特币源码中的应用.比特币是一个纯C++编写的项目,用到了C++11和bo ...
随机推荐
- 后台给前台传JSON字符串,前台解析并拼接显示
后台传JSON public class CourseType : IHttpHandler { Epoint.PeiXun.Bizlogic.BLL.CourseLibrary.PX_CourseT ...
- U盘格式转换
有一次想把5G的文件拷到U盘里面,悲催的发现拷不进去,文件过大...... 硬盘格式:NTFS 把自己的U盘也改了格式后,就可以了
- cookie的详细解释
突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...
- 另类分析SIGSEGV信号
关于SIGSEGV信号的含义就不解释了.网络上有很多解释. 今天记录一下,自己遇到的一个问题,想了好几天都没想出来的.今天终于想到原因了. 过程描述: 有个类 CBase,里面放了一个成员变量 DAT ...
- error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
以前一直用的VC6.0,最近换成VS2010了.哎这几天光折腾VS2010了. 曾经我以为程序没啥头绪忒头疼,现在觉得乱七八糟的编译问题才叫一个头裂=口= 原因:VC6.0中,如果没有直接显示指定的返 ...
- bootstrap学习
1. bootstrap使用了less作为预编译器,他是结构清晰层次分明的css页面构建样式,即使你不喜欢bootstrap的样式,你仍然可以借鉴bootstrap编写css的这种方式 2.boots ...
- 3、C#入门第3课
1.c#中一个解决方案 里面两个程序 怎么一个启动另一个? 我一个解决方案下,有两个工程,我想让A工程在适当时候,启动B工程,比如A中有个按钮,一点,B工程就启动了. System.Diagnosti ...
- jsr133
1:介绍 java虚拟机支持多线程运行.线程代表的就是Thread class.对用户来说创建线程的唯一办法就是创建一个Thread对象:每一个线程都和一个Thread对象关联.Thread对象调用s ...
- web编程
展示层 html/css/javascript/jquery/jquery easyUI/ajax bootstrap web层 varnish/haproxy/squid----lvs/keepal ...
- python_selenium智联搜索
python_selenium智联搜索 妹子要去招聘会工作,奈何网上仅仅提供招聘会的公司名字,没有提供招聘的职位,SO我写了个小代码给妹子在智联上面搜索职位,由于时间紧迫,前程的就不写了 #!/usr ...