]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp11/buffers/reference_counted.cpp
2 // reference_counted.cpp
3 // ~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #include <boost/asio.hpp>
18 using boost::asio::ip::tcp
;
20 // A reference-counted non-modifiable buffer class.
21 class shared_const_buffer
24 // Construct from a std::string.
25 explicit shared_const_buffer(const std::string
& data
)
26 : data_(new std::vector
<char>(data
.begin(), data
.end())),
27 buffer_(boost::asio::buffer(*data_
))
31 // Implement the ConstBufferSequence requirements.
32 typedef boost::asio::const_buffer value_type
;
33 typedef const boost::asio::const_buffer
* const_iterator
;
34 const boost::asio::const_buffer
* begin() const { return &buffer_
; }
35 const boost::asio::const_buffer
* end() const { return &buffer_
+ 1; }
38 std::shared_ptr
<std::vector
<char> > data_
;
39 boost::asio::const_buffer buffer_
;
43 : public std::enable_shared_from_this
<session
>
46 session(tcp::socket socket
)
47 : socket_(std::move(socket
))
59 std::time_t now
= std::time(0);
60 shared_const_buffer
buffer(std::ctime(&now
));
62 auto self(shared_from_this());
63 boost::asio::async_write(socket_
, buffer
,
64 [self
](boost::system::error_code
/*ec*/, std::size_t /*length*/)
69 // The socket used to communicate with the client.
76 server(boost::asio::io_context
& io_context
, short port
)
77 : acceptor_(io_context
, tcp::endpoint(tcp::v4(), port
))
85 acceptor_
.async_accept(
86 [this](boost::system::error_code ec
, tcp::socket socket
)
90 std::make_shared
<session
>(std::move(socket
))->start();
97 tcp::acceptor acceptor_
;
100 int main(int argc
, char* argv
[])
106 std::cerr
<< "Usage: reference_counted <port>\n";
110 boost::asio::io_context io_context
;
112 server
s(io_context
, std::atoi(argv
[1]));
116 catch (std::exception
& e
)
118 std::cerr
<< "Exception: " << e
.what() << "\n";