2 // async_udp_echo_server.cpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~
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)
13 #include <boost/bind.hpp>
14 #include <boost/asio.hpp>
16 using boost::asio::ip::udp
;
21 server(boost::asio::io_context
& io_context
, short port
)
22 : socket_(io_context
, udp::endpoint(udp::v4(), port
))
24 socket_
.async_receive_from(
25 boost::asio::buffer(data_
, max_length
), sender_endpoint_
,
26 boost::bind(&server::handle_receive_from
, this,
27 boost::asio::placeholders::error
,
28 boost::asio::placeholders::bytes_transferred
));
31 void handle_receive_from(const boost::system::error_code
& error
,
34 if (!error
&& bytes_recvd
> 0)
36 socket_
.async_send_to(
37 boost::asio::buffer(data_
, bytes_recvd
), sender_endpoint_
,
38 boost::bind(&server::handle_send_to
, this,
39 boost::asio::placeholders::error
,
40 boost::asio::placeholders::bytes_transferred
));
44 socket_
.async_receive_from(
45 boost::asio::buffer(data_
, max_length
), sender_endpoint_
,
46 boost::bind(&server::handle_receive_from
, this,
47 boost::asio::placeholders::error
,
48 boost::asio::placeholders::bytes_transferred
));
52 void handle_send_to(const boost::system::error_code
& /*error*/,
53 size_t /*bytes_sent*/)
55 socket_
.async_receive_from(
56 boost::asio::buffer(data_
, max_length
), sender_endpoint_
,
57 boost::bind(&server::handle_receive_from
, this,
58 boost::asio::placeholders::error
,
59 boost::asio::placeholders::bytes_transferred
));
64 udp::endpoint sender_endpoint_
;
65 enum { max_length
= 1024 };
66 char data_
[max_length
];
69 int main(int argc
, char* argv
[])
75 std::cerr
<< "Usage: async_udp_echo_server <port>\n";
79 boost::asio::io_context io_context
;
81 using namespace std
; // For atoi.
82 server
s(io_context
, atoi(argv
[1]));
86 catch (std::exception
& e
)
88 std::cerr
<< "Exception: " << e
.what() << "\n";