#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 мне непонятно, о чем вы спрашиваете в своем комментарии. Может быть, попробуйте уточнить свой первоначальный вопрос или задать новый вопрос?