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. python 字符串编码转换

    import chardetdef CheckCode(filename): adchar=chardet.detect(filename) if adchar['encoding']=='utf-8 ...

  2. PP 创建BOM

    转自 http://blog.csdn.net/u012369651/article/details/19190939 一.最终结果预览. 二.创建过程. 使用到的事务码 CS01 创建BOM CS0 ...

  3. sql server 更新视图的sp

    create procedure RefreshAllViewas begin declare @ViewName varchar(250) declare #views cursor for sel ...

  4. Django后台post请求中的csrf token

    使用Requests库操作自己的Django站点,post登陆admin页面返回403,serverlog显示csrf token not set. csrf token是get登陆页面时服务器放在c ...

  5. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

  6. 关于vue.js中条件渲染的练习

    html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...

  7. HDU 1403-Longest Common Substring (后缀数组)

    Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...

  8. 有关默认相机转VR相机

    呃...15年开篇~ 去年想写一个有关默认相机转VR相机的脚本,当时没写完,今天不小心翻到并写完了,而且思路也和原来完全不一样了,增加了是否删除原相机与是否转换所选相机的选项. 由于国内VR版本比较混 ...

  9. C#四种深拷贝方法

    //四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || ...

  10. Hadoop Pipeline详解[摘抄]

    最近使用公司内部的一个框架写map  reduce发现没有封装hadoop streaming这些东西,查了下pipeline相关的东西 Hadoop Pipeline详解 20. Aug / had ...