diff options
Diffstat (limited to '3rdparty/asio/src/examples/cpp03/multicast/sender.cpp')
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/multicast/sender.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp b/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp new file mode 100644 index 00000000000..995f05aa48e --- /dev/null +++ b/3rdparty/asio/src/examples/cpp03/multicast/sender.cpp @@ -0,0 +1,99 @@ +// +// sender.cpp +// ~~~~~~~~~~ +// +// Copyright (c) 2003-2016 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 <iostream> +#include <sstream> +#include <string> +#include "asio.hpp" +#include "boost/bind.hpp" +#include "boost/date_time/posix_time/posix_time_types.hpp" + +const short multicast_port = 30001; +const int max_message_count = 10; + +class sender +{ +public: + sender(asio::io_context& io_context, + const asio::ip::address& multicast_address) + : endpoint_(multicast_address, multicast_port), + socket_(io_context, endpoint_.protocol()), + timer_(io_context), + message_count_(0) + { + std::ostringstream os; + os << "Message " << message_count_++; + message_ = os.str(); + + socket_.async_send_to( + asio::buffer(message_), endpoint_, + boost::bind(&sender::handle_send_to, this, + asio::placeholders::error)); + } + + void handle_send_to(const asio::error_code& error) + { + if (!error && message_count_ < max_message_count) + { + timer_.expires_from_now(boost::posix_time::seconds(1)); + timer_.async_wait( + boost::bind(&sender::handle_timeout, this, + asio::placeholders::error)); + } + } + + void handle_timeout(const asio::error_code& error) + { + if (!error) + { + std::ostringstream os; + os << "Message " << message_count_++; + message_ = os.str(); + + socket_.async_send_to( + asio::buffer(message_), endpoint_, + boost::bind(&sender::handle_send_to, this, + asio::placeholders::error)); + } + } + +private: + asio::ip::udp::endpoint endpoint_; + asio::ip::udp::socket socket_; + asio::deadline_timer timer_; + int message_count_; + std::string message_; +}; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: sender <multicast_address>\n"; + std::cerr << " For IPv4, try:\n"; + std::cerr << " sender 239.255.0.1\n"; + std::cerr << " For IPv6, try:\n"; + std::cerr << " sender ff31::8000:1234\n"; + return 1; + } + + asio::io_context io_context; + sender s(io_context, asio::ip::make_address(argv[1])); + io_context.run(); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +} |