Boost.Asio学习之Buffer
2017-01-10 11:07
330 查看
详情见:http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/examples/cpp11_examples.html
或者:https://github.com/NearXdu/AsioLearn
在example中,简单实现了一个buffer。
下面的代码给出3种情况,分别是构造string、输出、写入到网络套接字。
结果如下:
或者:https://github.com/NearXdu/AsioLearn
1.示例
我们经常这样写代码:size_t read_complete(boost::system::error_code, size_t bytes){ ... } char buff[1024]; read(sock, boost::asio::buffer(buff), read_complete); write(sock, buffer("echo\n"));
在example中,简单实现了一个buffer。
// //This example demonstrates how to create reference counted buffers that can be used with socket read and write operations #include <boost/asio.hpp> #include <iostream> #include <memory> #include <utility> #include <vector> using namespace boost::asio; using namespace boost::asio::ip; class shared_const_buffer { public: // Construct from a std::string. explicit shared_const_buffer(const std::string& data) : data_(new std::vector<char>(data.begin(), data.end())),// buffer_(boost::asio::buffer(*data_)) { } // Implement the ConstBufferSequence requirements. typedef boost::asio::const_buffer value_type; typedef const boost::asio::const_buffer* const_iterator; const boost::asio::const_buffer* begin() const { return &buffer_; } const boost::asio::const_buffer* end() const { return &buffer_ + 1; } private: std::shared_ptr<std::vector<char> > data_; boost::asio::const_buffer buffer_; }; class session:public std::enable_shared_from_this<session> { public: session(tcp::socket socket):socket_(std::move(socket)) { } void start() { do_write(); } private: void do_write() { std::time_t now = std::time(0); //代替boost::asio::buffer shared_const_buffer buffer(std::ctime(&now)); auto self(shared_from_this()); boost::asio::async_write(socket_, buffer, [this, self](boost::system::error_code /*ec*/, std::size_t /*length*/) { });//lambda } tcp::socket socket_; };
2.streambuf简介
使用streambuf可以轻松的将结构体的内容写入到网络套接字中,前提是利用ostream完成简单的对<<和>>操作符的重载。下面的代码给出3种情况,分别是构造string、输出、写入到网络套接字。
#include <iostream> #include <unistd.h> #include <boost/asio.hpp> #include <boost/bind.hpp> using namespace std; struct person { std::string first_name, last_name; int age; }; std::ostream& operator<<(std::ostream & out, const person & p) { return out <<"first_name: "<< p.first_name << " " <<"last_name: "<< p.last_name << " " << p.age; } std::istream& operator>>(std::istream & in, person & p) { return in >> p.first_name >> p.last_name >> p.age; } int main() { boost::asio::streambuf buf; std::ostream out(&buf); person p; p.last_name="zhang"; p.first_name="xiao"; p.age=25; boost::system::error_code ec; // … 初始化p out << p << std::endl; #if 0 //1.构造string std::ostringstream anotherout; anotherout<<&buf; string message(anotherout.str()); cout<<message<<endl; #endif // cout<<&buf<<endl;//2.输出到屏幕 #if 1 //3.写入到网络套接字 boost::asio::io_service service; boost::asio::ip::tcp::socket sock(service); boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"),1024) ); sock.open(boost::asio::ip::tcp::v4()); sock.connect(ep); boost::asio::write(sock,buf,ec); #endif return 0; }
结果如下:
相关文章推荐
- boost::asio学习之[七] buffer
- 【boost学习】之boost::asio(4)——boost::asio::buffer用法
- boost::asio学习笔记 server端
- boost::asio学习 - multithreaded programs
- Boost asio学习笔记—— 网络编程
- boost::asio学习 - HTTP Server性能测试报告
- boost.asio系列——buffer
- boost asio io_service学习笔记
- boost.asio 学习笔记01——概述
- boost::asio学习 - io_service的run,run_one,poll,poll_one的区别
- boost::asio::buffer
- 一步一步学习 Boost 之 Asio
- boost::asio学习 - 常用方法总结
- boost的asio中的buffer的使用
- boost::asio学习 - io_service的run,run_one,poll,poll_one的区别
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost::asio学习 - HTTP Server性能测试报告
- boost::asio学习 - HTTP Server性能测试报告
- boost::asio学习文章