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 ...
随机推荐
- track by
ng-repeat指令中使用track by子语句解决重复数据遍历的错误 <li ng-repat="x in [2, 2]" ng-bind="x"&g ...
- 特殊的对象引用---$this
只要是对象中的成员,必须使用这个对象($this)来访问到这个对象内部的属性和方法 特殊对象的引用$this就是再对象内部的成员方法中,代表本对象的一个引用,但智能在对象的成员方法中使用,不管是在对象 ...
- OpenGL 4.5 Core Profile管线(GLSL与应用程序接口详解)【未完成】
之前写过一篇博客,OpenGL管线(用经典管线代说着色器内部),说的主要是OpenGL的经典管线.大家都知道,现代OpenGL已经弃用(从OpenGL 3.0开始)经典管线功能(glBegin,变换矩 ...
- this其实是js的一个对象谁调用它它就指向谁
本人看了一下,感觉对this解释的有点复杂了,因此,本人在此给this一个简单易于理解的定义. 因为上面计算出来的结果不符合我们的习惯,并且负值在计算的时候会影响正确性,现在我们给这个结果加上180 ...
- AFN的初步封装(post、GET、有无参数)
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MyURLPost : NSObjec ...
- Fiddler (HTTP抓包)简介
1.什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请 ...
- 开发时建议关闭chrome的缓存[Disable cache(while DevTools open)]
问题:修改了css,JS后,chrome看不到效果 具体情景:最近在写一个PHPbbs,在写CSS时,习惯性的按F5刷新,firefox ie等,都能即时见到效果,唯独chrome 怎么都不行,想了想 ...
- Python数字,字符串
数字 支持整数,浮点数,和奇怪的类型,如复数. 特殊的运算符为**,表示次方操作,如2**100,表示2的100次方. len()可以得到一个字符串对象的长度,str()可以将数字转换为字符串. pr ...
- DataSet,DataTable与DataRow的复制方法
DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据 ...
- MYSQL 判断一个时间段是否在另一个时间段内。
[1 CREATE TABLE #B 2 ( 3 MeetingRoom int, 4 BeginTime datetime, 5 EndTime datetime6 ) 7 insert into ...