В 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, и эта проблема по-прежнему существует с Qt 5.6 и Win7.
Проблема в том, что joinMulticastGroup()
использует первый адрес интерфейса, не проверяя его IPV4 или IPV6 (даже если вы используете AnyIpv4 в bind).
Эта проблема не исправлена в официальном выпуске Qt, но предлагаемый патч работает для меня:
Попробуйте прочитать isValid() и в конечном итоге
QNetworkInterface::CanMulticast
из флагов интерфейса и проверки QNetworkInterface::IsRunning
и не имеет QNetworkInterface::IsLoopBack
.
Кроме того, проверьте связанные IPv4 в addresses()
с помощью QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol
QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol
и что это для меня? Первый и второй интерфейс имеют IPv4-адрес и IPv6-адрес. joinMulticastGroup присоединяется только к первому интерфейсу. Но если интерфейсы не имеют IPv6-адреса, joinMulticastGroup объединяет оба.