2013-10-07 54 views
0

在Windows中,我有兩個物理接口。在每個接口上設置兩個IP地址:IPv4和IPv6。 下面的代碼確實在這個配置不正確的工作:joinMulticastGroup的第一界面和一個界面joinMulticastGroup回報只返回真正Qt:所有接口的joinMulticastGroup

但是,如果我關閉Windows接口上的IPv6,此代碼工作。

幫我理解。

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)。

這個問題是不固定在官方發佈的Qt,但所提出的修補工作對我來說:

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