首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt:用于所有接口的joinMulticastGroup

Qt:用于所有接口的joinMulticastGroup
EN

Stack Overflow用户
提问于 2013-10-07 07:15:00
回答 3查看 5.8K关注 0票数 1

在Windows中,我有两个物理接口。在每个接口上设置两个IP地址: IPv4和IPv6。以下代码在此配置中不正确:joinMulticastGroup只为第一个接口返回true,对于下一个接口,joinMulticastGroup返回false

但是,如果我在Windows界面上关闭IPv6,这段代码就可以工作了。

帮我理解。

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

发布于 2016-05-22 17:36:46

我最近处理了多播和Qt,Qt5.6和Win7似乎仍然存在这个问题。

问题是,joinMulticastGroup()使用接口的第一个地址,而不检查它是IPV4还是IPV6 (即使在bind中使用AnyIpv4 )。

这个问题在正式Qt发行版中没有解决,但建议的修补程序适用于我:

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

票数 3
EN

Stack Overflow用户

发布于 2013-10-07 07:59:18

试着阅读isValid()并最终

QNetworkInterface::CanMulticast来自接口标志并检查QNetworkInterface::IsRunning,并且没有QNetworkInterface::IsLoopBack

此外,在addresses()QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol中检查关联的QNetworkAddressEntry::ip().protocol() == QAbstractSocket::IPv4Protocol

票数 1
EN

Stack Overflow用户

发布于 2021-09-23 18:44:52

因此,对于一个可能帮助其他人的工作示例,请在下面的QT5.15.0 MinGW中找到在Qt 64位中工作的内容。本质上,获取接口的列表,然后循环遍历这些接口,并丢弃那些不应该通过测试标志和isValid()函数使用的接口。

在我的示例中,我只想加入初始QUDPSocket绑定调用的IP地址。如果您愿意并最终将该接口上的所有有效地址连接起来,则if /然后筛选是可选的。

代码语言:javascript
复制
// Windows is weird
QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
// Try the multicast UDP socket for SA first
saMC = new QUdpSocket(this);
saMC->setSocketOption(QAbstractSocket::LowDelayOption, 1);
//saMC->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
connect(saMC, &QUdpSocket::readyRead, this, &Commander::handleDatagram, Qt::UniqueConnection);
QHostAddress toBind("192.168.0.51");
if(saMC->bind(toBind, 6969, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint))
{
    foreach(QNetworkInterface interface, interfaces)
    {
        //qDebug()<<"interface:"<<interface.isValid()<<interface.flags();
        QNetworkInterface::InterfaceFlags iflags = interface.flags();
        if(interface.isValid() && !iflags.testFlag(QNetworkInterface::IsLoopBack) && iflags.testFlag(QNetworkInterface::CanMulticast) && iflags.testFlag(QNetworkInterface::IsRunning))
        {

            QList<QNetworkAddressEntry> addressEntries = interface.addressEntries();
            for (int i = 0; i < addressEntries.length(); i++) {
                QNetworkAddressEntry ae = addressEntries.at(i);
                if(ae.ip() == toBind)
                {
                    bool ok = false;
                    if (ae.ip().protocol() == QAbstractSocket::IPv4Protocol)
                    {
                        ok = saMC->joinMulticastGroup(QHostAddress("239.2.3.1"), interface);
                    }
                    if(ok)
                    {
                        qDebug()<<"SA bound...join mc group:"<<ae.ip();
                    }
                    else
                    {
                        qDebug()<<"SA bound...interface unsuitable for Multicast:"<<ae.ip();
                    }
                }
            }
        }
    }
}
else
{
    qDebug()<<"SA multicast socket unable to bind...."<<saMC->errorString();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19218994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档