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. 后台给前台传JSON字符串,前台解析并拼接显示

    后台传JSON public class CourseType : IHttpHandler { Epoint.PeiXun.Bizlogic.BLL.CourseLibrary.PX_CourseT ...

  2. U盘格式转换

    有一次想把5G的文件拷到U盘里面,悲催的发现拷不进去,文件过大...... 硬盘格式:NTFS 把自己的U盘也改了格式后,就可以了

  3. cookie的详细解释

    突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...

  4. 另类分析SIGSEGV信号

    关于SIGSEGV信号的含义就不解释了.网络上有很多解释. 今天记录一下,自己遇到的一个问题,想了好几天都没想出来的.今天终于想到原因了. 过程描述: 有个类 CBase,里面放了一个成员变量 DAT ...

  5. error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    以前一直用的VC6.0,最近换成VS2010了.哎这几天光折腾VS2010了. 曾经我以为程序没啥头绪忒头疼,现在觉得乱七八糟的编译问题才叫一个头裂=口= 原因:VC6.0中,如果没有直接显示指定的返 ...

  6. bootstrap学习

    1. bootstrap使用了less作为预编译器,他是结构清晰层次分明的css页面构建样式,即使你不喜欢bootstrap的样式,你仍然可以借鉴bootstrap编写css的这种方式 2.boots ...

  7. 3、C#入门第3课

    1.c#中一个解决方案 里面两个程序 怎么一个启动另一个? 我一个解决方案下,有两个工程,我想让A工程在适当时候,启动B工程,比如A中有个按钮,一点,B工程就启动了. System.Diagnosti ...

  8. jsr133

    1:介绍 java虚拟机支持多线程运行.线程代表的就是Thread class.对用户来说创建线程的唯一办法就是创建一个Thread对象:每一个线程都和一个Thread对象关联.Thread对象调用s ...

  9. web编程

    展示层 html/css/javascript/jquery/jquery easyUI/ajax bootstrap web层 varnish/haproxy/squid----lvs/keepal ...

  10. python_selenium智联搜索

    python_selenium智联搜索 妹子要去招聘会工作,奈何网上仅仅提供招聘会的公司名字,没有提供招聘的职位,SO我写了个小代码给妹子在智联上面搜索职位,由于时间紧迫,前程的就不写了 #!/usr ...