Как получить от нескольких многоадресных удаленных интерфейсов? - PullRequest
2 голосов
/ 31 марта 2011

Я использую Boost :: asio для следующих действий.

Я пытаюсь получать пакеты от нескольких многоадресных каналов udp.Однако, я испытываю большие затруднения, пытаясь заставить это работать.На данный момент я могу прослушивать только первый канал.

Вот мой код:

// create a list of endpoints for each channel

endpoint_list.push_back(new boost::asio::ip::udp::endpoint( (boost::asio::ip::address::from_string(boost::get<1>(interfaces_list[i]))).to_v4(), boost::get<2>(interfaces_list[i])));

// create a list of join_groups for each channel

join_group_list.push_back(new boost::asio::ip::multicast::join_group( (boost::asio::ip::address::from_string(boost::get<1>(interfaces_list[i]))).to_v4(),   (boost::asio::ip::address::from_string(boost::get<0>(interfaces_list[i]))).to_v4() ) );

//initiate options on each channel

socket_list[i]->open(endpoint_list[i]->protocol());     socket_list[i]->set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_list[i]->bind(*endpoint_list[i]);
socket_list[i]->set_option(*join_group_list[i]);

// callback on each socket

socket_list[i]->async_receive_from(boost::asio::buffer(buffer_array_list[i], max_length), sender_endpoint_, boost::bind(&PacketLogger::HandleReceiveFrom, this, i, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

Как видите, у каждого канала есть свои собственные сокеты и тому подобное.У меня есть 3 части информации: локальный интерфейс / удаленный интерфейс / удаленный порт, и все они верны, потому что я могу отлично слушать на первом канале.1010 *

Спасибо.

1 Ответ

0 голосов
/ 22 мая 2011

Многоадресная рассылка IP управляется на уровне хоста, а не на уровне сокетов, если у вас есть две конфликтующие подписки на сокеты, то что-то сломается.

Например, вы можете присоединиться к группе в режиме только для отправкичерез опцию IP_MULTICAST_IF впоследствии ни одно приложение на этом компьютере не сможет подписаться на какие-либо данные в этой группе.

Чтобы продолжить, попробуйте подписки в стороннем приложении или вместо этого можете использовать какой-нибудь базовый код C.

...