Это относительно просто сделать.Вот базовый класс, который обрабатывает большинство всего, что вам нужно, используя синхронные вызовы:
#include <boost/asio.hpp>
#include <boost/scoped_ptr.hpp>
class MulticastSender
{
public:
MulticastSender(const boost::asio::ip::address& multicast_addr,
const unsigned short multicast_port)
: ep_(multicast_addr, multicast_port)
{
socket_.reset(new boost::asio::ip::udp::socket(svc_, ep_.protocol()));
}
~MulticastSender()
{
socket_.reset(NULL);
}
public:
void send_data(const std::string& msg)
{
socket_->send_to(
boost::asio::buffer(msg.str()), ep_);
}
private:
boost::asio::ip::udp::endpoint ep_;
boost::scoped_ptr<boost::asio::ip::udp::socket> socket_;
boost::asio::io_service svc_;
};
Этот простой класс удовлетворяет 2 из 3 ваших требований (без обработки ошибок).Чтобы использовать его, просто создайте его экземпляр в соответствующем месте, и ваша реализация потока просто вызывает MulticastSender :: send_data () для отправки многоадресных данных в связанную конечную точку.