因此,对于可能对其他人有所帮助的工作示例,请在下面找到在带有 Qt 5.15.0 MinGW 的 Win10 Pro 64 位中的工作原理。本质上,获取接口列表,然后循环遍历这些接口并通过测试标志和函数丢弃不应使用的isValid()
接口。
在我的示例中,我只想加入我最初的 QUDPSocket 绑定调用的 IP 地址。如果您愿意,if/then 过滤器是可选的,它会导致加入该接口上的所有有效地址。
// 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();
}