您的位置:首页 > Web前端

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

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;
}


结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: