Вы не показывали receiver
класс, я думаю, это выглядит как
struct receiver
{
receiver(boost::asio::io_service& io, ...)
: io(io), ...
{
}
boost::asio::io_service& io;
};
, ключевой момент здесь в том, что receiver
хранит ссылку на io_service
объект.io_service
- это один из многих классов в asio, который нельзя скопировать / переместить.Если класс содержит ссылку, то компилятор не может генерировать операции копирования / перемещения для этого типа класса.Также receiver
не имеет конструктора по умолчанию.Эти ограничения приводят к тому, что вы не можете использовать, например, vector<receiver>
для хранения получателей - что будет полезно, когда объекты создаются в цикле.
Простым способом решения этой проблемы является использование (умных) указателей - shared_ptr
.
Если io_service
не является общим для ваших receiver
экземпляров,Вы можете указать его как переменную-член receiver
:
struct receiver {
receiver(boost::asio::ip::address, boost::asio::ip::address)
: th(boost::bind(&boost::asio::io_service::run,&ioService))
{ // ^^^ thread is started here
}
~receiver() {
if (th.joinable())
th.join();
}
boost::asio::io_service ioService;
boost::thread th;
};
и main
можно уменьшить до:
try {
if (argc != 3) {
std::cerr << "Usage: receiver <listen_address> <multicast_address>\n";
std::cerr << " For IPv4, try:\n";
std::cerr << " receiver 0.0.0.0 239.255.0.1\n";
std::cerr << " For IPv6, try:\n";
std::cerr << " receiver 0::0 ff31::8000:1234\n";
return 1;
}
std::vector<boost::shared_ptr<receiver>> receivers;
for (int i = 0; i < 2; ++i)
{
receivers.push_back(boost::make_shared<receiver>(boost::asio::ip::address::from_string(argv[1]),
boost::asio::ip::address::from_string(argv[2])));
}
}
catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
Скомпилировано