Asio基本接口
Asio是C++的网络库,有boost和非boost这两种版本,这里涉及的都是非boost的版本。Asio官方文档
在使用Asio时可以只包含头文件asio.hpp,如果知道所用接口具体在哪个头文件中定义,也可以直接包含该头文件。
buffer
头文件asio/buffer.hpp
asio::buffer的接口很多,下面这些都是:
mutable_buffers_1 buffer(const mutable_buffer & b);
mutable_buffers_1 buffer(const mutable_buffer & b, std::size_t max_size_in_bytes);
const_buffers_1 buffer(const const_buffer & b);
const_buffers_1 buffer(const const_buffer & b, std::size_t max_size_in_bytes);
mutable_buffers_1 buffer(void * data, std::size_t size_in_bytes);
const_buffers_1 buffer(const void * data, std::size_t size_in_bytes);
// 模板
template< typename PodType, std::size_t N>
mutable_buffers_1 buffer( PodType (&data)[N]);
template<typename PodType, std::size_t N>
mutable_buffers_1 buffer(PodType (&data)[N], std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const PodType (&data)[N]);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const PodType (&data)[N], std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
mutable_buffers_1 buffer(boost::array< PodType, N > & data);
template<typename PodType, std::size_t N>
mutable_buffers_1 buffer(boost::array< PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(boost::array< const PodType, N > & data);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(boost::array< const PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const boost::array< PodType, N > & data);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const boost::array< PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
mutable_buffers_1 buffer(std::array< PodType, N > & data);
template<typename PodType, std::size_t N>
mutable_buffers_1 buffer(std::array< PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(std::array< const PodType, N > & data);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(std::array< const PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const std::array< PodType, N > & data);
template<typename PodType, std::size_t N>
const_buffers_1 buffer(const std::array< PodType, N > & data, std::size_t max_size_in_bytes);
template<typename PodType, typename Allocator>
mutable_buffers_1 buffer(std::vector< PodType, Allocator > & data);
template<typename PodType, typename Allocator>
mutable_buffers_1 buffer(std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes);
template<typename PodType, typename Allocator>
const_buffers_1 buffer(const std::vector< PodType, Allocator > & data);
template<typename PodType, typename Allocator>
const_buffers_1 buffer(const std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes);
template<typename Elem, typename Traits, typename Allocator>
const_buffers_1 buffer(const std::basic_string< Elem, Traits, Allocator > & data);
template<typename Elem, typename Traits, typename Allocator>
const_buffers_1 buffer(const std::basic_string< Elem, Traits, Allocator > & data, std::size_t max_size_in_bytes);
一般常用的是这几个:
mutable_buffers_1 buffer(void * data, std::size_t size_in_bytes);
一般用带有指定大小的比较方便,这样可以重复利用buffer,不需要去整一个恰好大小的buffer。
官方的例子:
char d1[128];
size_t bytes_transferred = sock.receive(asio::buffer(d1));
std::vector<char> d2(128);
bytes_transferred = sock.receive(asio::buffer(d2));
std::array<char, 128> d3;
bytes_transferred = sock.receive(asio::buffer(d3));
boost::array<char, 128> d4;
bytes_transferred = sock.receive(asio::buffer(d4));
注意,如果用的是STL容器,如vector,虽然它是可以动态调整大小的,但是buffer不会去调整它,所以传进去的vector的size决定了这个buffer所能容纳的数据量,而不是capacity决定的。buffer的其他接口还有buffer_size获取大小、buffer_cast类型转换、buffer_copy拷贝,这里不谈了。
write
写的接口比较少,只有如下四个:
template<typename AsyncWriteStream, typename ConstBufferSequence, typename WriteHandler>
void-or-deduced async_write(AsyncWriteStream & s, const ConstBufferSequence & buffers, WriteHandler handler);
template<typename AsyncWriteStream, typename ConstBufferSequence, typename CompletionCondition, typename WriteHandler>
void-or-deduced async_write(AsyncWriteStream & s, const ConstBufferSequence & buffers, CompletionCondition completion_condition, WriteHandler handler);
template<typename AsyncWriteStream, typename Allocator, typename WriteHandler>
void-or-deduced async_write(AsyncWriteStream & s, basic_streambuf< Allocator > & b, WriteHandler handler);
template<typename AsyncWriteStream, typename Allocator, typename CompletionCondition, typename WriteHandler>
void-or-deduced async_write(AsyncWriteStream & s, basic_streambuf< Allocator > & b, CompletionCondition completion_condition, WriteHandler handler);
一般可以这样用:
char data[size] = ...;
asio::async_write(sock, asio::buffer(data, size), handler);
Asio基本接口的更多相关文章
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 如何在多线程leader-follower模式下正确的使用boost::asio。
#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...
- 网络库crash以及boost asio strand dispath分析
最近在做服务器的稳定性的相关测试,服务器的网络底层使用的是boost asio,然后自己做的二次封装以更好的满足需求. 服务器昨天晚上发现crash了一次,之前测试了将近半个多月,有一次是莫名的退出了 ...
- boost asio tcp server 拆分
从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...
- boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)
* Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...
- boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合
有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...
- boost.asio源码剖析(二) ---- 架构浅析
* 架构浅析 先来看一下asio的0层的组件图. (图1.0) io_object是I/O对象的集合,其中包含大家所熟悉的socket.deadline_tim ...
随机推荐
- UVA - 10780 唯一分解定理
白书P171 对m,n!分解,质因子指数取min #include<iostream> #include<algorithm> #include<cstdio> # ...
- HDU - 1403 后缀数组初步
题意:求两个串的最长公共子串 两个串连接起来然后求高度数组 注意两个sa值必须分别在不同一侧 本题是用来测试模板的,回想起青岛那次翻车感觉很糟糕 #include<iostream> #i ...
- Hibernate Annotation
[转自] http://blog.sina.com.cn/s/blog_7ebc1b7e0100w58e.html Table Table用来定义entity主表的name,catalog,schem ...
- 牌型种数-dfs-蓝桥杯2015
牌型种数 牌型种数 小明被劫持到 X 赌城,被迫与其他 3 人玩牌. 一副扑克牌(去掉大小王牌,共 52 张),均匀发给 4 个人,每个人 13 张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花 ...
- 使用kafka bin目录中的zookeeper-shell.sh来查看kafka在zookeeper中的配置
cd kafka_2.11-0.10.2.1\bin\windowsecho ls /brokers/ids | zookeeper-shell.bat localhost:2181 使用kafka ...
- CentOS-pam认证机制简介
前言 linux下PAM模块全称是Pluggable Authentication Module for linux(可插入式授权管理模块),该由Sun公司提供,在Linux中,PAM是可动态配置的, ...
- zookeeper+dubbo简单部署方案
1.zookeeper服务 首先,我们需要下载:zookeeper-3.4.9 解压后,在conf文件夹中添加一个配置文件zoo.cfg,内容如下: tickTime=2000 dataDir=/Us ...
- Ignite cahce 存储object类型数据和object类型数据序列化后string存储区别
Ignite cache在存储时 object类型的数据和 序列化该object成string类型 两者存储时间差不多. 但是这两者在读取出来的时候,string类型比object类型快很多. 以下为 ...
- CentOS(Linux)主机名字前多了 (base),如何取消和添加
我们知道IDE中有显示或隐藏某个选项/页面的功能,我们想要修改这个参数,一般都会到设置(settings)中去找.那么与之对应的,Linux上这个终端对应的设置也应该找设置文件. Terminal对应 ...
- java scoket http TCP udp
http://blog.csdn.net/kongxx/article/details/7259436 TCP/UDP: 齐全:http://www.blogjava.net/Reg/archive/ ...