Многоадресная передача на конкретный интерфейс в macOS с помощью Boost ASIO

У меня есть кусок кода, который отправляет многоадресное сообщение на каждый сетевой интерфейс Ethernet на Mac (потому что устройства, которые отвечают, могут быть через Wi-Fi или проводное соединение Ethernet). Этот код уже давно работает нормально:

for(int i = 0; i < strIPAddresses.size(); i++)
{
boost::asio::ip::address addr;
addr.from_string(strIPAddresses[i]);
m_pcDiscoverySocket->set_option(boost::asio::ip::multicast::outbound_interface(addr.to_v4()));
m_pcDiscoverySocket->send_to(boost::asio::buffer((void*)pGetDeviceInfoMessage->m_pchData, pGetDeviceInfoMessage->m_ulDataSize), senderEndpoint);
}

Где strIPAddresses — это строковый массив IP-адресов каждого сетевого интерфейса.

Однако в macOS 10.12 что-то изменилось в том, как реализован этот код, и, похоже, он игнорирует функцию, устанавливающую исходящий интерфейс, и сам решает, какой интерфейс лучше отправить сообщение. Я вижу это, используя Wireshark на другой машине — он видит двойное число каждого сообщения по Wi-Fi, когда второе сообщение должно быть отправлено по проводному интерфейсу.

Кто-нибудь знает способ заставить macOS отправлять многоадресные сообщения по заданному интерфейсу, предпочтительно используя Boost ASIO?

0

Решение

Привязка сокета к интерфейсу обычно происходит только один раз в жизни сокетов. Я мог бы представить, что случай, когда сокет повторно привязан к другому интерфейсу, просто не работает, так как он не проверен ни в Boost, ни даже в ОС.

Что произойдет, если вы просто попробуете проводной интерфейс, без предварительной привязки к интерфейсу WiFi? Если это работает, вы нашли ошибку и знаете обходной путь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]