7 threads.reset(
new boost::thread_group);
8 work.reset(
new boost::asio::io_service::work(io_service));
9 for (
int i = 0; i < n_threads; i++)
11 threads->create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
13 socket.reset(
new boost::asio::ip::udp::socket(io_service));
14 socket->open(boost::asio::ip::udp::v4());
15 boost::asio::socket_base::reuse_address reuse_address(
true);
16 socket->set_option(boost::asio::socket_base::reuse_address(
true));
25 if (socket.use_count() > 0)
27 if (socket->is_open())
29 socket->shutdown(boost::asio::ip::udp::socket::shutdown_both);
42 std::unique_lock<std::mutex> lock(endpoints_mutex);
45 std::vector<boost::asio::ip::udp::endpoint>::iterator it;
46 boost::asio::ip::address address = boost::asio::ip::address::from_string(ip);
47 for (it = endpoints.begin(); it != endpoints.end(); it++)
49 if ((*it).address() == address)
51 throw UDP::Exception(
"Client is already among broadcast recipients!");
54 endpoints.push_back(boost::asio::ip::udp::endpoint(address, port));
56 catch (std::exception& exception)
58 std::string message = std::string(
"Error while adding UDP client: ") + exception.what();
65 std::unique_lock<std::mutex> lock(endpoints_mutex);
68 std::vector<boost::asio::ip::udp::endpoint>::iterator it;
69 boost::asio::ip::address address = boost::asio::ip::address::from_string(ip);
70 for (it = endpoints.begin(); it != endpoints.end(); it++)
72 if ((*it).address() == address)
77 if (it == endpoints.end())
83 catch (std::exception& exception)
85 std::string error_message = std::string(
"Error while removing UDP client: ") + exception.what();
90void UDP::Broadcast::_send(std::string message)
92 if (socket.use_count() == 0)
96 if (socket->is_open())
98 std::unique_lock<std::mutex> lock(endpoints_mutex);
99 std::shared_ptr<std::string> local_message(
new std::string(message));
100 std::vector<boost::asio::ip::udp::endpoint>::iterator it;
101 for (it = endpoints.begin(); it != endpoints.end(); it++)
103 socket->send_to(boost::asio::buffer(*local_message), *it);
111 io_service.post(boost::bind(&UDP::Broadcast::_send,
this, message +
"\r\n"));
116 std::string message =
"";
117 for (std::vector<std::string>::iterator it = messages.begin(); it != messages.end(); it++)
119 message += (*it) +
"\r\n";
121 io_service.post(boost::bind(&UDP::Broadcast::_send,
this, message));
136 this->add_client(it->first, it->second);
void remove_client(std::string ip)
Remove UDP client.
Broadcast(int n_threads=1)
Constructor.
void configure(UDP::Configuration config)
Configure Broadcast.
void send(std::string message)
Send Message.
void add_client(std::string ip, unsigned int port)
Add UDP client.
UDP Broadcast Configuration.
std::map< std::string, int >::iterator iterator
Iterator.
std::map< std::string, int > clients
List of clients.