]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp11/local/connect_pair.cpp
5 // Copyright (c) 2003-2017 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)
15 #include <boost/asio.hpp>
16 #include <boost/thread/thread.hpp>
18 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
20 using boost::asio::local::stream_protocol
;
22 class uppercase_filter
25 uppercase_filter(stream_protocol::socket sock
)
26 : socket_(std::move(sock
))
34 socket_
.async_read_some(boost::asio::buffer(data_
),
35 [this](boost::system::error_code ec
, std::size_t size
)
40 for (std::size_t i
= 0; i
< size
; ++i
)
41 data_
[i
] = std::toupper(data_
[i
]);
48 throw boost::system::system_error(ec
);
53 void write(std::size_t size
)
55 boost::asio::async_write(socket_
, boost::asio::buffer(data_
, size
),
56 [this](boost::system::error_code ec
, std::size_t /*size*/)
65 throw boost::system::system_error(ec
);
70 stream_protocol::socket socket_
;
71 std::array
<char, 512> data_
;
78 boost::asio::io_context io_context
;
80 // Create a connected pair and pass one end to a filter.
81 stream_protocol::socket
socket(io_context
);
82 stream_protocol::socket
filter_socket(io_context
);
83 boost::asio::local::connect_pair(socket
, filter_socket
);
84 uppercase_filter
filter(std::move(filter_socket
));
86 // The io_context runs in a background thread to perform filtering.
94 catch (std::exception
& e
)
96 std::cerr
<< "Exception in thread: " << e
.what() << "\n";
103 // Collect request from user.
104 std::cout
<< "Enter a string: ";
106 std::getline(std::cin
, request
);
108 // Send request to filter.
109 boost::asio::write(socket
, boost::asio::buffer(request
));
111 // Wait for reply from filter.
112 std::vector
<char> reply(request
.size());
113 boost::asio::read(socket
, boost::asio::buffer(reply
));
115 // Show reply to user.
116 std::cout
<< "Result: ";
117 std::cout
.write(&reply
[0], request
.size());
118 std::cout
<< std::endl
;
121 catch (std::exception
& e
)
123 std::cerr
<< "Exception: " << e
.what() << "\n";
128 #else // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
129 # error Local sockets not available on this platform.
130 #endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)