你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去。并且提到如果想这样做,需要使用boost asio的async_write

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_stream_socket/async_write_some.html

RemarksThe write operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

但是这几天我就遇到一个问题,以前一直都是一次发送成功的。

我想发送54个字节的数据,可是每次都是只发9个字节。因此只好自己写了一个重试发送的递归函数。也很简单,通过bind,每次传递想要发送的字节数木和发送开始位置给异步回调函数。

代码参考如下:

void Sign::AfterWriteMessage(error_code const& ec, size_t bytes_transferred, size_t expected_size,  size_t offset) {if (ec) {BOOSTER_ERROR("AfterWriteMessage") << "write message failed, error code:" << ec.value()<< " category name:" << ec.category().name()<< " id_:" << id_<< " address:" << address  << " message:" << ec.message();Close();return;}BOOSTER_DEBUG("AfterWriteMessage") << "thread id: " << this_thread::get_id() << " send_buffer: " << PrintBytesAsHexString(send_buffer, bytes_transferred) << " sent size:" << bytes_transferred;BOOSTER_DEBUG("AfterWriteMessage") << "thread id: " << this_thread::get_id() << " send_buffer: " << PrintBytesAsHexString(send_buffer, expected_size) << " expected size:" << expected_size;size_t resend_size = expected_size - bytes_transferred;if (resend_size > 0) {size_t new_offset = offset + bytes_transferred;async_write(socket, buffer((void*)&send_buffer[new_offset], resend_size),strand_.wrap(bind(&Sign::AfterWriteMessage, shared_from_this(), _1, _2, resend_size, new_offset)));return;}// do your business after send succeeds}void Sign::SendMessage(size_t size) {//  BOOSTER_DEBUG("SendMessage") << "thread id: " << this_thread::get_id() << " send_buffer: " << PrintBytesAsHexString(send_buffer, size) << " size:" << size;async_write(socket, buffer(send_buffer, size),strand_.wrap(bind(&Sign::AfterWriteMessage, shared_from_this(), _1, _2, size, 0)));
}

但是为什么呢?难道真的是bug. 请看下一篇。

boost::asio async_write也不能保证一次发完所有数据 一相关推荐

  1. boost::asio async_write也不能保证一次发完所有数据 二

    只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重 ...

  2. 网上收集下boost::asio发送与传输相关的几个函数,老是忘记

    刚连接上:调用async_accept 1 boost::shared_ptr<tcp::socket> spMySocket(new tcp::socket(m_ioservice)); ...

  3. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  4. boost asio 异步实现tcp通讯

    一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常 ...

  5. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  6. Boost.Asio使用实例

    1.概述: Boost.Asio是一个跨平台的C++库,用于网络和底层I/O编程,可以在I/O对象(如socket)上执行同步和异步操作. 2.简略的过程分析.以socket的连接操作为例: 你的程序 ...

  7. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

  8. Boost asio 官方教程简介

    1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理 ...

  9. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

最新文章

  1. 工业4.0是个白日梦吗?
  2. Python(四)字符串
  3. 数据库-左外连接-右外连接
  4. zookeeper 源码阅读(2)
  5. Java中方法的继承以及父类未被子类覆盖的方法调用的问题
  6. c语言 div ldiv_C ++中带有示例的ldiv()函数
  7. newman执行测试_postman+newman+Jenkins之API全自动化测试(MAC)
  8. 小小一行Python命令,居然把电脑变成服务器
  9. Osql\sqlcmd工具管理 SQL Server
  10. opencv中Mat的数学运算和基本操作
  11. 同步计数 Java_Java之同步计数器CyclicBarrier
  12. 唧唧Down(B站视频下载) 彻底解决你的B站视频下载问题
  13. dnf脚本是php,dnf自动搬砖脚本教程autojs在使用
  14. Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class lzl.edu.c
  15. 白皮书显示,2022年仅有28.4%企业实现社保基数完全合规,有38.1%企业额外购买补充商业保险 | 美通社头条...
  16. 【T+】畅捷通T+存货档案批量修改存货属性
  17. 您需要最新版本的Outlook才能使用此数据库-MacOS的Outlook
  18. 大数据惊人:凌晨4点的中国人都在做什么?
  19. Window: win10 如何更改管理员名称(修改登录用户名)
  20. 中英离线翻译mac_Instant Translate for Mac-即时翻译Mac版下载 V1.3.0-PC6苹果网

热门文章

  1. GBT19668.3-2007 电子设备机房系统工程监理规范
  2. 什么是JAVA内容仓库(Java Content Repository)(4完)
  3. 电脑连接示波器读取数据
  4. 华为机试HJ3:明明的随机数
  5. java 月度相减_java根据日期获取月龄,按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。...
  6. MyBatis-Plus速览【学习笔记】
  7. IDEA运行test出现 Failed to execute goal org.codehaus.mojo:exec-maven-plugin:16.0.0:exec (default-cli) on
  8. CSS基础——CSS 背景(background)【学习笔记】
  9. JenkinsDay18-查看服务器有哪些JOB
  10. 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试