]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp03/local/connect_pair.cpp
934731b71045de975048c6733d826d5aa4d31ad2
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)
14 #include <boost/asio.hpp>
15 #include <boost/thread/thread.hpp>
16 #include <boost/array.hpp>
17 #include <boost/bind.hpp>
19 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
21 using boost::asio::local::stream_protocol
;
23 class uppercase_filter
26 uppercase_filter(boost::asio::io_context
& io_context
)
31 stream_protocol::socket
& socket()
39 socket_
.async_read_some(boost::asio::buffer(data_
),
40 boost::bind(&uppercase_filter::handle_read
,
41 this, boost::asio::placeholders::error
,
42 boost::asio::placeholders::bytes_transferred
));
46 void handle_read(const boost::system::error_code
& ec
, std::size_t size
)
51 for (std::size_t i
= 0; i
< size
; ++i
)
52 data_
[i
] = std::toupper(data_
[i
]);
55 boost::asio::async_write(socket_
, boost::asio::buffer(data_
, size
),
56 boost::bind(&uppercase_filter::handle_write
,
57 this, boost::asio::placeholders::error
));
61 throw boost::system::system_error(ec
);
65 void handle_write(const boost::system::error_code
& ec
)
70 socket_
.async_read_some(boost::asio::buffer(data_
),
71 boost::bind(&uppercase_filter::handle_read
,
72 this, boost::asio::placeholders::error
,
73 boost::asio::placeholders::bytes_transferred
));
77 throw boost::system::system_error(ec
);
81 stream_protocol::socket socket_
;
82 boost::array
<char, 512> data_
;
85 void run(boost::asio::io_context
* io_context
)
91 catch (std::exception
& e
)
93 std::cerr
<< "Exception in thread: " << e
.what() << "\n";
102 boost::asio::io_context io_context
;
104 // Create filter and establish a connection to it.
105 uppercase_filter
filter(io_context
);
106 stream_protocol::socket
socket(io_context
);
107 boost::asio::local::connect_pair(socket
, filter
.socket());
110 // The io_context runs in a background thread to perform filtering.
111 boost::thread
thread(boost::bind(run
, &io_context
));
115 // Collect request from user.
116 std::cout
<< "Enter a string: ";
118 std::getline(std::cin
, request
);
120 // Send request to filter.
121 boost::asio::write(socket
, boost::asio::buffer(request
));
123 // Wait for reply from filter.
124 std::vector
<char> reply(request
.size());
125 boost::asio::read(socket
, boost::asio::buffer(reply
));
127 // Show reply to user.
128 std::cout
<< "Result: ";
129 std::cout
.write(&reply
[0], request
.size());
130 std::cout
<< std::endl
;
133 catch (std::exception
& e
)
135 std::cerr
<< "Exception: " << e
.what() << "\n";
140 #else // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
141 # error Local sockets not available on this platform.
142 #endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)