Как я могу реализовать простой отправитель многоадресной рассылки boost.asio?

#c #visual-studio-2005 #udp #boost-asio #multicast

#c #visual-studio-2005 #udp #boost-asio #многоадресная рассылка

Вопрос:

Я хочу использовать boost.asio для создания отправителя многоадресной рассылки UDP. У меня есть мой поток, и я хочу использовать boost только для:

  • сокет;

  • отправить ();

  • Обработка ошибок;

Можете ли вы что-нибудь предложить?

Комментарии:

1. С чем именно у вас возникли проблемы? Можете ли вы опубликовать какой-нибудь код, который вы уже пробовали?

Ответ №1:

Это относительно просто выполнить. Вот базовый класс, который обрабатывает большую часть всего, что вам нужно, используя синхронные вызовы:

 #include <boost/asio.hpp>
#include <boost/scoped_ptr.hpp>

class MulticastSender
{
public:
   MulticastSender(const boost::asio::ip::addressamp; 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::stringamp; 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() для отправки данных многоадресной рассылки в связанную конечную точку.

Комментарии:

1. Это не будет компилироваться, msg.str() неверен, и даже если бы это был c_str (), он не работал бы с send_to ().

Ответ №2:

Вы попробовали образцы?

 <boost>libsasioexamplemulticast
  

Он содержит выборки для

 receiver.cpp
sender.cpp
  

Комментарии:

1. Я видел примеры многоадресного отправителя, но, возможно, это не то, что мне нужно. Теперь у меня есть свой собственный поток (я должен использовать эту реализацию потока). Я хотел бы использовать boost только для сокета: если я посмотрю на отправителя, как я понимаю, там что-то асинхронное: вы можете использовать какой-нибудь поток? Я заметил это: аннулирует handle_send_to (const boost::system::error_code amp; error); аннулирует handle_timeout (const boost:: system::error_code amp; error); Возможно ли использовать синхронные сокеты?

2. @GgSalent мне непонятно, о чем вы спрашиваете в своем комментарии. Может быть, попробуйте уточнить свой первоначальный вопрос или задать новый вопрос?