boost--asio--读写大总结
NO.1
ASIO 读操作大总结:
A. Boos::asio::read 同步读方式
void client::read_data(char * sourse , int num )
{
boost::asio::read( socket_own , boost::asio::buffer( sourse , num ) );
}
Buffer 可以换成 boost::streambuf
如:
boost::asio::streambuf response ;
boost::asio::read (socket, response );
而 streambuf 是能过自动扩充的 。
B. boost::asio::read_until 同步方式读, 但是读到特定的字符串后结束
例子;
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");
C: boost::asio::read_at 是在读的时候加上一个偏移量( I thin k )但是我用在socket的读写上没有成功, 可能用在其他device 上, 好吧,先不用你 。
俩个函数 ,
示例如下:
boost::array<char,
boost::asio::transfer_all(), ec);
if (ec)
{
// An error occurred.
}
else
{
// n == 128
}
同理:boost::array<char, 128> buf;
boost::system::error_code ec;
std::size_t n = boost::asio::read(
sock, boost::asio::buffer(buf),
boost::asio::transfer_at_least(64), ec);
if (ec)
{
// An error occurred.
}
else
{
// n >= 64 && n <= 128
}
其实以上就是实现了socket。Read_some 的作用 。
---------------------------------------------------------------------------------
D.重量出击 socke 成员函数 读操作
Socket. Receive ( boost::asio::buffer( buff ) );
利用receive的好处之一就是它既可以代替read 函数,同时还可以在后边加一个flag 参数 , 设置socket 的属性。
E: 更好使的是 socket.read_some ( boost::asio::buffer( buff ) ) ;
这个函数的神奇之处在于, 你在buffer中设置了比较大的缓冲区,这没有问题 , 它并不一定会把缓冲区填满才完成,而是读到eof 即完成操作,这样我们可以不必在关心server到底会发多少size_t 给client,我们 只管设置一个较大缓冲区, read_some 就知道读多少。它返回 std::size_t.
F: 以上介绍的都是同步方式操作的,下面是相对应的异步读操作。
如下是 boost::asio 命名空间下:
boost::bind( & client::handle_read ,this , boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred );boost::asio::async_read( socket_own , boost::asio::buffer ( data_copy ) ,
);
相对应的socket 的成员函数 异步操作如下:
void handler(示例如下:
const boost::system::error_code& error, // Result of operation.
std::size_t bytes_transferred // Number of bytes read.
);
socket.async_read_some(boost::asio::buffer(data, size), handler);
很好的是, async_read_some 能够知道读多少数据, 所以我们的size可以尽可能的大一点,而 receive 的话可以保证读固定大小数据。
---------------------------------------------------------------------------------------
第二部分 写
ASIO 读操作大总结:
A. Boos::asio::write 同步写方式
void client::write_data(char * sourse , int num )
{
boost::asio::write( socket_own , boost::asio::buffer( sourse , num ) );
}
Buffer 可以换成 boost::streambuf
boost--asio--读写大总结的更多相关文章
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio异步读写网络聊天程序客户端 实例详解
boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio tcp 多线程异步读写,服务器与客户端。
// server.cpp #if 0 多个线程对同一个io_service 对象处理 用到第三方库:log4cplus, google::protobuf 用到C++11的特性,Windows 需要 ...
- boost::asio 的同、异步方式
转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...
- boost::asio 使用 libcurl
curl 使用 asio 的官方样例 http://curl.haxx.se/libcurl/c/asiohiper.html, 但这个例子用起来有很明细的 bug,asio 异步IO 只注册一次,也 ...
- Boost.Asio c++ 网络编程翻译(14)
保持活动 假如,你须要做以下的操作: io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, ...
- 使用Boost.Asio编写通信程序
摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...
- Boost.Asio的使用技巧
基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...
- Boost.Asio 网络编程([译]Boost.Asio基本原理)
转自:https://m.w3cschool.cn/nlzbw/nlzbw-3vs825ya.html Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将 ...
- boost.asio源码剖析(三) ---- 流程分析
* 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: #include <iostream> #include <boost/asio.hpp& ...
随机推荐
- Hive记录-Impala jdbc连接hive和kudu参考
1.配置环境Eclipse和JDK 2.加载hive jar包或者impala jar包 备注:从CDH集群里面拷贝出来 下载地址:https://www.cloudera.com/downloads ...
- HDU 1045(炮台安置 DFS)
题意是在 n*n 的方格中进行炮台的安置,炮台不能处于同一行或同一列(类似于八皇后问题),但若是炮台间有墙壁阻挡,则可以同时安置这对炮台.问图中可以安放的最大炮台数目. 用深搜的方法,若此处为空地,则 ...
- vue实现简单日历
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 外部程序调用Django模块的解决办法
Question django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
- Vertica系列:Vertica和Hadoop的互操作性
Vertica 8和 Hadoop 集群的互操作性已经很不错的, 但这块肯定是Vertica研发的重点, 将来可能还有较大的变动. Vertica 集群 和 Hadoop 集群的两种布局方式 集群布局 ...
- XOR 加密
XOR 是一个神奇的运算符, 观察它的真值表, 很容易得到以下结论: 假设现有 a , b 变量, 则 a ^ 0 == a a ^ 0xff == ~a (取反加1等于作为补码的a的真值的相反数的补 ...
- 【四】Java虚拟机内存区域初识
一.线程独占区 1.程序计数器 程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码 ...
- 使用Verilog HDL语言注意事项
1.wire和reg区别,输入输出是wire型,表示硬件线的连接,要在always模块里被赋值需要中间reg型变量,两者通过: assign 输入/输出=reg型中间变量 2.case的default ...
- 堆栈Stack介绍
堆栈(Stack)代表了一个后进先出的对象集合.当您需要对各项进行后进先出的访问时,则使用堆栈.当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素. Stack 类的方法和属性 ...