在Windows中,我有两个物理接口。在每个接口上设置两个IP地址:IPv4和IPv6。下面的代码不能正确地在此配置中工作:joinMulticastGroup返回true仅限第一个接口,下一个接口joinMulticastGroup返回false。
但是,如果我在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;
}
字符串
3条答案
按热度按时间uplii1fm1#
我最近在处理多播和Qt,这个问题似乎在Qt 5.6和Win7中仍然存在。
问题是
joinMulticastGroup()
使用接口的第一个地址,而不检查它是IPV4还是IPV6(即使您在绑定中使用AnyIpv4)。这个问题在官方的Qt版本中没有修复,但建议的补丁对我来说很有效:
https://bugreports.qt.io/browse/QTBUG-27641
4nkexdtk2#
尝试阅读isValid()并最终
QNetworkInterface::CanMulticast
从接口标志和检查QNetworkInterface::IsRunning
和不具有QNetworkInterface::IsLoopBack
。此外,检查
addresses()
中与QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol
关联的IPv4kyks70gy3#
因此,对于一个可以帮助其他人的工作示例,请在下面找到在Win10 Pro 64位中使用Qt 5.15.0 MinGW的工作原理。本质上,获取一个接口列表,然后循环遍历这些接口,并通过测试标志和
isValid()
函数抛出不应使用的接口。在我的示例中,我只想加入初始QUdpSocket绑定调用的IP地址。如果您愿意,该if/then过滤器是可选的,并且会导致连接该接口上的所有有效地址。
字符串