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相关的更多相关文章

  1. boost 相关

    编译boost: 1.打开Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prom ...

  2. 编译用到boost相关的东西,问题的解决;以及和googletest库

    编译https://github.com/RAttab/reflect, 发现需要gcc4.7以上的版本才行.于是编译安装最新的gcc-6.2.0, 过程算顺利. http://www.linuxfr ...

  3. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  4. boost function对象

    本文根据boost的教程整理. 主要介绍boost function对象的用法. boost function boost function是什么 boost function是一组类和模板组合,用于 ...

  5. boost 的函数式编程库 Phoenix入门学习

    这篇文章是我学习boost phoenix的总结. 序言 Phoenix是一个C++的函数式编程(function programming)库.Phoenix的函数式编程是构建在函数对象上的.因此,了 ...

  6. Gradient Boost 算法流程分析

    我们在很多Gradient Boost相关的论文及分析文章中都可以看到下面的公式: 但是,对这个公式的理解,我一直也是一知半解,最近,终于下决心对其进行了深入理解. 步骤1:可以看作优化目标的损失函数 ...

  7. 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

    请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...

  8. Boost 和 Boost.Build 的设置

    问题: 安装编译完 Boost 后,如果不设置 BOOST_ROOT 和 BOOST_BUILD_PATH 则可能导致使用 bjam 时定位到 Boost 默认的路径 /usr/share/boost ...

  9. 比特币源码分析--C++11和boost库的应用

    比特币源码分析--C++11和boost库的应用     我们先停下探索比特币源码的步伐,来分析一下C++11和boost库在比特币源码中的应用.比特币是一个纯C++编写的项目,用到了C++11和bo ...

随机推荐

  1. jquery CRUD一个元素class属性

    jquery增加,移除,修改一个html标签的class名字 一个标签可以指定多个class 1.         增加一个class: $(".default").addClas ...

  2. C++模板实例化

    深入理解C++中第七章提到模板实例化参数的选择:函数的决议结果只和函数参数有关和返回值无关.记录一下. 测试程序如下: #include <iostream> using namespac ...

  3. C++类和对象

    1.在类体中和类体外定义成员函数是有区别的:在类体中定义的成员函数为内联(inline)函数,在类体外定义的不是.内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员 ...

  4. 关于对CSS尺寸单位'em'的长期误解

    一直以来认为'em'是相对于父元素的字体大小. 直到今天学习移动WEB开发,重新复习css的尺寸大小时,惊奇发现:对em深深的误解了!!! 在CSS官网对em的解释实例是: a. h1{line-he ...

  5. Javascript 自动计算生日

    首先调用方法需要注意 //inner_page为外围大层,确保时间可以实时修改  $(".inner_page").mouseover(function() {        va ...

  6. Rethink your own

    0 声明 文中显式或隐式指出是摘抄的部分,仅代表原作者的观点. 该随笔的动机源自胡适先生的一句话的前半部分: 1 知识以及建立知识的过程有强弱.高大上土肥圆之分吗? 文章摘自传说中的1024:[真人轉 ...

  7. 信号量 semaphore 和 @synchronized 的运用

    1. //创建全局队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //创建信号量 dispatch_semaphore_t s ...

  8. 模仿console自写函数打印js的对象

    本以为写个递归函数就可以将js的对象打印出来. 当然第一个想到的估计是JSON.stringify() 这个函数.但这个函数打印到浏览器 显示效果不友好.最友好的显示肯定是 控制台打印咯. 结果尝试打 ...

  9. CE 消息处理

    MFC消息发送: static HANDLE hWnd =FindWindow(NULL,_T("Client")); //找到窗口 if(hWnd == INVALID_HAND ...

  10. [NOIP2011] 观光公交(贪心)

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...