У меня хост с двумя интерфейсами. В моем конкретном случае я пытаюсь присоединиться к группе многоадресной рассылки, используя boost::asio::ip::multicast::join_group
, который, похоже, работает только в том случае, если я использую конструктор, включающий локальный адрес. Однако я заранее не знаю IP-адрес локального интерфейса, подключенного к удаленному хосту, который будет выполнять многоадресную рассылку. Однако я знаю, что это будет eth1. Конечно, я мог бы сделать его настраиваемым, но это похоже на введение бесполезной возможности неправильной настройки, видя, как один и тот же адрес должен быть настроен для интерфейса и моего приложения.
В идеале был бы очевидный способ создать boost::asio::endpoint
или boost::asio::address
из интерфейса вместо адреса, который я как-то пропустил. В качестве альтернативы я, конечно, был бы так же доволен любым другим способом вывести интерфейс IP, который работает как с DHCP-сервером, так и без него.
Есть ли правильный способ сделать то или иное, или я просто должен доверять пользователям, чтобы они никогда не возились с конфигурацией?
Чтобы убедиться, что это не полностью проблема XY, вот код, который я использовал во время тестирования для присоединения к группе многоадресной рассылки:
m_socket.open(boost_ip::udp::v4());
m_socket.bind(boost_ip::udp::endpoint(boost_ip::udp::v4(), listeningPort));
m_socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
m_socket.set_option(boost::asio::ip::multicast::join_group(
boost::asio::ip::address::from_string("225.x.x.10").to_v4(), // remote
boost::asio::ip::address::from_string("192.x.x.3").to_v4())); // local
Это работает, но когда я отбрасываю последнюю строку, чтобы она не зависела от текущего локального адреса (который может быть изменен при развертывании), я больше не получаю никаких пакетов.