diff options
Diffstat (limited to 'doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp')
-rw-r--r-- | doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp b/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp new file mode 100644 index 0000000000..b87d4015e6 --- /dev/null +++ b/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp @@ -0,0 +1,94 @@ +// +// daytime_client.cpp +// ~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <array> +#include <future> +#include <iostream> +#include <thread> +#include <boost/asio/io_service.hpp> +#include <boost/asio/ip/udp.hpp> +#include <boost/asio/use_future.hpp> + +using boost::asio::ip::udp; + +void get_daytime(boost::asio::io_service& io_service, const char* hostname) +{ + try + { + udp::resolver resolver(io_service); + + std::future<udp::resolver::iterator> iter = + resolver.async_resolve( + {udp::v4(), hostname, "daytime"}, + boost::asio::use_future); + + // The async_resolve operation above returns the endpoint iterator as a + // future value that is not retrieved ... + + udp::socket socket(io_service, udp::v4()); + + std::array<char, 1> send_buf = {{ 0 }}; + std::future<std::size_t> send_length = + socket.async_send_to(boost::asio::buffer(send_buf), + *iter.get(), // ... until here. This call may block. + boost::asio::use_future); + + // Do other things here while the send completes. + + send_length.get(); // Blocks until the send is complete. Throws any errors. + + std::array<char, 128> recv_buf; + udp::endpoint sender_endpoint; + std::future<std::size_t> recv_length = + socket.async_receive_from( + boost::asio::buffer(recv_buf), + sender_endpoint, + boost::asio::use_future); + + // Do other things here while the receive completes. + + std::cout.write( + recv_buf.data(), + recv_length.get()); // Blocks until receive is complete. + } + catch (std::system_error& e) + { + std::cerr << e.what() << std::endl; + } +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: daytime_client <host>" << std::endl; + return 1; + } + + // We run the io_service off in its own thread so that it operates + // completely asynchronously with respect to the rest of the program. + boost::asio::io_service io_service; + boost::asio::io_service::work work(io_service); + std::thread thread([&io_service](){ io_service.run(); }); + + get_daytime(io_service, argv[1]); + + io_service.stop(); + thread.join(); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + } + + return 0; +} |