]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/phoenix/example/adapted_echo_server.cpp
2 // Copyright (c) 2011 Thomas Heller
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #define BOOST_PHOENIX_NO_PREDEFINED_TERMINALS
13 #include <boost/phoenix.hpp>
14 #include <boost/asio.hpp>
16 namespace phx
= boost::phoenix
;
18 using boost::phoenix::ref
;
20 BOOST_PHOENIX_ADAPT_FUNCTION(void, read
, boost::asio::async_read
, 4)
21 BOOST_PHOENIX_ADAPT_FUNCTION(void, write
, boost::asio::async_write
, 3)
22 BOOST_PHOENIX_ADAPT_FUNCTION(boost::asio::mutable_buffers_1
, buffer
, boost::asio::buffer
, 2)
24 template <typename Acceptor
, typename Socket
, typename Handler
>
25 void accept_impl(Acceptor
& acceptor
, Socket
& socket
, Handler
const & handler
)
27 acceptor
.async_accept(socket
, handler
);
29 BOOST_PHOENIX_ADAPT_FUNCTION(void, accept
, accept_impl
, 3)
31 typedef phx::expression::local_variable
<struct action_key
>::type action
;
33 #include <boost/function.hpp>
35 int main(int argc
, char* argv
[])
41 std::cerr
<< "Usage: async_tcp_echo_server <port>\n";
45 phx::lambda_type lambda
;
46 phx::arg_names::_1_type _1
;
48 boost::asio::io_service io_service
;
49 boost::asio::ip::tcp::acceptor
acceptor(io_service
, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), std::atoi(argv
[1])));
50 boost::asio::ip::tcp::socket
socket(io_service
);
51 std::size_t const max_length
= 1024;
54 std::cout
<< "server starting...\n";
56 boost::function
<void(boost::system::error_code
const &)> accept_handler
;
57 phx::expression::argument
<1>::type _error
;
58 phx::expression::argument
<2>::type _length
;
62 , (lambda(_action
= lambda
[_1
])
66 bind(_action
, ref(socket
), ref(buf
), _error
, _length
)
70 bind(&boost::asio::ip::tcp::socket::close
, ref(socket
))
71 , accept(ref(acceptor
), ref(socket
), phx::ref(accept_handler
))
75 boost::function
<void(boost::system::error_code
const &, std::size_t)> read_handler
;
76 boost::function
<void(boost::system::error_code
const &, std::size_t)> write_handler
;
81 read(ref(socket
), buffer(ref(buf
), max_length
), boost::asio::transfer_at_least(1), phx::ref(read_handler
))
85 phx::expression::argument
<1>::type _socket
;
86 phx::expression::argument
<2>::type _buf
;
87 phx::expression::argument
<3>::type _error
;
88 phx::expression::argument
<4>::type _length
;
89 read_handler
= create_handler(
90 write(_socket
, buffer(_buf
, _length
), phx::ref(write_handler
))
93 write_handler
= create_handler(
94 read(_socket
, buffer(_buf
, max_length
), boost::asio::transfer_at_least(1), phx::ref(read_handler
))
98 acceptor
.async_accept(
105 catch (std::exception
& e
)
107 std::cerr
<< "Exception: " << e
.what() << "\n";