Qt: joinMulticastGroup для всего интерфейса

0

В Windows у меня есть два физических интерфейса. На каждом интерфейсе устанавливаются два IP-адреса: IPv4 и IPv6. Следующий код не исправляет работу в этой конфигурации: joinMulticastGroup возвращает true только для первого интерфейса, а для следующего интерфейса joinMulticastGroup возвращает false.

Но, если я отключу IPv6 на интерфейсах Windows, этот код работает.

Помогите мне понять.

QUdpSocket udpSocket;
QHostAddress groupAddress;

groupAddress = QHostAddress("239.255.255.250");
udpSocket.bind(QHostAddress::AnyIPv4, 1900,
                QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);

QList<QNetworkInterface> mListIfaces = QNetworkInterface::allInterfaces();

for (int i = 0; i < mListIfaces.length(); ++i) {
    bool rez = udpSocket.joinMulticastGroup(groupAddress, mListIfaces.at(i));
    qDebug() << rez;
}
Теги:
qt
multicast

2 ответа

1

Я недавно имел дело с многоадресными и Qt, и эта проблема по-прежнему существует с Qt 5.6 и Win7.

Проблема в том, что joinMulticastGroup() использует первый адрес интерфейса, не проверяя его IPV4 или IPV6 (даже если вы используете AnyIpv4 в bind).

Эта проблема не исправлена в официальном выпуске Qt, но предлагаемый патч работает для меня:

https://bugreports.qt.io/browse/QTBUG-27641

0

Попробуйте прочитать isValid() и в конечном итоге

QNetworkInterface::CanMulticast из флагов интерфейса и проверки QNetworkInterface::IsRunning и не имеет QNetworkInterface::IsLoopBack.

Кроме того, проверьте связанные IPv4 в addresses() с помощью QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol

  • 0
    не транслировать, если какой-либо из названных флагов () не установлен. Также делайте многоадресную рассылку только по IPv4, если связан адрес IPv4.
  • 0
    Для всего интерфейса установлены CanMulticast, IsValid, IsRunning. Не в этом дело. QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol и что это для меня? Первый и второй интерфейс имеют IPv4-адрес и IPv6-адрес. joinMulticastGroup присоединяется только к первому интерфейсу. Но если интерфейсы не имеют IPv6-адреса, joinMulticastGroup объединяет оба.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню