// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2017 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) // #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include using boost::asio::ip::udp; using std::cout; using std::cin; using std::endl; class sender { private: boost::asio::ip::udp::endpoint endpoint_; boost::asio::ip::udp::socket socket_; boost::asio::steady_timer timer_; int message_count_; std::string message_; short multicast_port = 13000; //30001 int max_message_count = 10; public: sender(boost::asio::io_context& io_context, const boost::asio::ip::address& multicast_address) : endpoint_(multicast_address, multicast_port), socket_(io_context, endpoint_.protocol()), timer_(io_context), message_count_(0) { //message_ = "abcd"; //do_send(); send_periodic(); } private: void do_send() { static int i = 0; cout << i << endl; // show count ++i; std::ostringstream os; os << "Message " << message_count_++; message_ = os.str(); socket_.async_send_to(boost::asio::buffer(message_), endpoint_, [this](boost::system::error_code ec, std::size_t /*length*/) { //if (!ec && message_count_ < max_message_count) if (!ec) do_timeout(); }); } void do_timeout() { timer_.expires_after(std::chrono::seconds(1)); timer_.async_wait([this](boost::system::error_code ec) { if (!ec) do_send(); }); } void send_periodic() { static int i = 0; message_ = some_string(); socket_.async_send_to(boost::asio::buffer(message_), endpoint_, [this](boost::system::error_code ec, std::size_t /*length*/) { //cout << i << endl; // show count cout << i << " - " << message_; // show count ++i; }); timer_.expires_after(std::chrono::seconds(1)); timer_.async_wait([this](boost::system::error_code ec) { send_periodic(); }); } std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } std::string some_string() { std::string result; // ==================================================== //result = "abcd"; // ==================================================== //os << "Message " << message_count_++; //result = os.str(); // ==================================================== //std::stringstream ss; //ss << i; //result = ss.str(); // ==================================================== result = make_daytime_string(); return result; } }; int main(int argc, char* argv[]) { // ============================================================================================================ try { //if (argc != 2) //{ // std::cerr << "Usage: sender \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; //} boost::asio::io_context io_context; //sender s(io_context, boost::asio::ip::make_address(argv[1])); //sender s(io_context, boost::asio::ip::make_address("127.0.0.1")); //sender s(io_context, boost::asio::ip::make_address("239.255.0.1")); sender s(io_context, boost::asio::ip::make_address("192.168.0.255")); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; }