2013-10-07 3 views
0

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

Но, если я отключу 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; 
} 

ответ

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 присоединяется к обоим. – AndreyKeen

+0

Ваш код пытается соединиться на всех интерфейсах. Но '' QUdpSocket :: joinMulticastGroup (const QHostAddress & groupAddress) '' присоединяется к интерфейсу по умолчанию, выбранному ОС (из документов). Проверьте ошибку сокета для конкретных проблем: '' qDebug() << QUdpSocket :: errorString(); '' MultiCast действителен только для IPv4 –

1

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

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

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

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

Смежные вопросы