Asio是C++的网络库,有boost和非boost这两种版本,这里涉及的都是非boost的版本。Asio官方文档html
在使用Asio时能够只包含头文件asio.hpp
,若是知道所用接口具体在哪一个头文件中定义,也能够直接包含该头文件。c++
buffer
头文件asio/buffer.hpp
网络
asio::buffer
的接口不少,下面这些都是:async
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);
通常经常使用的是这几个:spa
mutable_buffers_1 buffer(void * data, std::size_t size_in_bytes);
通常用带有指定大小的比较方便,这样能够重复利用buffer,不须要去整一个刚好大小的buffer。code
官方的例子:htm
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
写的接口比较少,只有以下四个:ci
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);