相關資料:
https://download.csdn.net/download/zhujianqiangqq/21056178 代碼包下載
https://blog.csdn.net/ShiKongDeJinTou/article/details/88896465 Qt中UDP使用雙網卡廣播
實例一講解:
如果小路由器通過10網關接上外網時,
1.雙網卡電腦對10網段的網卡發出UDP信息時,10網段電腦可以收到,192網段電腦也可以收到。
2.雙網卡電腦對192網段的網卡發出UDP信息時,10網段電腦接上不到,192可以接收到信息。
實例二講解:
如果小路由器不通過10網關,不接外網時,
1.雙網卡電腦對10網段的網卡發出UDP信息時,10網段電腦可以接收到信息,192網段電腦接收不到信息。
2.雙網卡電腦對192網段的網卡發出UDP信息時,10網段電腦接收不到信息,192網段電腦可以接收到信息。
實例:
udpsend.cpp主函數

1 void MainWindow::on_pushButton_clicked() 2 { 3 QNetworkInterface oNet; 4 QHostAddress oHostAddress; 5 foreach (QNetworkInterface oNetInterface, QNetworkInterface::allInterfaces()) 6 { 7 QNetworkInterface::InterfaceFlags flags = oNetInterface.flags(); 8 // 判斷是不是可用網,是不是回環網(回環是WINDOW自測試用的) 9 if (!flags.testFlag(QNetworkInterface::IsRunning) || flags.testFlag(QNetworkInterface::IsLoopBack)) 10 continue; 11 qDebug() << "============================================"; 12 qDebug()<< QStringLiteral("網絡接口名稱:") <<oNetInterface.humanReadableName(); 13 qDebug()<< QStringLiteral("接口的低級硬件地址:") <<oNetInterface.hardwareAddress(); 14 qDebug()<< QStringLiteral("網絡接口的名稱:") <<oNetInterface.name(); 15 qDebug()<< QStringLiteral("網絡接口有效信息:") << oNetInterface.isValid(); 16 qDebug()<< QStringLiteral("網絡接口處於活動狀態:") << flags.testFlag(QNetworkInterface::IsUp); 17 qDebug()<< QStringLiteral("網絡接口已分配資源:") << flags.testFlag(QNetworkInterface::IsRunning); 18 qDebug()<< QStringLiteral("網絡接口是一個環回接口:") << flags.testFlag(QNetworkInterface::IsLoopBack); 19 qDebug()<< QStringLiteral("網絡接口是一個點對點接口:") << flags.testFlag(QNetworkInterface::IsPointToPoint); 20 // 根據MAC地址幫定網卡(無線網卡“64:27:37:05:EB:98”,有線網卡“24:B6:FD:0C:CB:28”) 21 if (oNetInterface.hardwareAddress() == "64:27:37:05:EB:98") 22 { 23 oNet = oNetInterface; 24 } 25 // 遍歷每一個IP地址(每個包含一個IP地址,一個子網掩碼和一個廣播地址,出現二個IP是因為IP4、IP6) 26 foreach(QNetworkAddressEntry entry, oNetInterface.addressEntries()) 27 { 28 QHostAddress broadcastAddress = entry.broadcast();// IPv4地址和網絡掩碼關聯的廣播地址 29 qDebug() << "----------------------------------------"; 30 qDebug() << QStringLiteral("IPv4地址和網絡掩碼關聯的廣播地址:") << broadcastAddress; 31 qDebug()<< QStringLiteral("IPv4或IPv6地址:") << entry.ip().toString(); 32 qDebug()<< QStringLiteral("IP地址關聯的網絡掩碼:") << entry.netmask().toString(); 33 qDebug()<< QStringLiteral("是否為IPv4或IPv6多播地址:") <<broadcastAddress.isMulticast(); 34 qDebug()<< QStringLiteral("是否為IPv4或IPv6廣播地址:") <<broadcastAddress.isBroadcast(); 35 if(broadcastAddress != QHostAddress::Null && 36 entry.ip() != QHostAddress::LocalHost && 37 entry.ip().protocol() == QAbstractSocket::IPv4Protocol) 38 { 39 if (oNetInterface.hardwareAddress() == "64:27:37:05:EB:98") 40 { 41 oHostAddress = broadcastAddress; 42 } 43 } 44 } 45 } 46 // 初始化指定網卡的UDP對象 47 QUdpSocket oUDPSend; 48 oUDPSend.bind(QHostAddress::AnyIPv4, PORT);// 第一步:需要先幫定 49 oUDPSend.setMulticastInterface(oNet);// 第二步:指定網卡 50 oUDPSend.joinMulticastGroup(QHostAddress("224.0.0.100"), oNet);// 第三步:加入到指定網卡的廣播中 51 // 發送信息 52 QDateTime sysDateTime; 53 QByteArray msg = (sysDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss")+" \n").toLatin1(); 54 oUDPSend.writeDatagram(msg, QHostAddress("224.0.0.100"), PORT); 55 // 輸出測試信息(只是測試,沒有實際作用) 56 QNetworkInterface mymi = oUDPSend.multicastInterface(); 57 qDebug() << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; 58 qDebug()<< QStringLiteral("網絡接口名稱:") <<mymi.humanReadableName(); 59 qDebug()<< QStringLiteral("接口的低級硬件地址:") <<mymi.hardwareAddress(); 60 qDebug()<< QStringLiteral("網絡接口的名稱:") <<mymi.name(); 61 // 輸出信息(提示用,沒有實際作用) 62 ui->textEdit->insertPlainText(QStringLiteral("1")); 63 }
udpReceiver.cpp主函數

1 MainWindow::MainWindow(QWidget *parent) 2 : QMainWindow(parent) 3 , ui(new Ui::MainWindow) 4 { 5 ui->setupUi(this); 6 7 QNetworkInterface oNet; 8 foreach (QNetworkInterface oNetInterface, QNetworkInterface::allInterfaces()) 9 { 10 QNetworkInterface::InterfaceFlags flags = oNetInterface.flags(); 11 if (!flags.testFlag(QNetworkInterface::IsRunning) || flags.testFlag(QNetworkInterface::IsLoopBack)) 12 continue; 13 // 指定網卡 14 if (oNetInterface.hardwareAddress() == "24:B6:FD:0C:CB:28") 15 { 16 oNet = oNetInterface; 17 } 18 } 19 20 m_pUDPReceiver = new QUdpSocket; 21 m_pUDPReceiver->bind(QHostAddress::AnyIPv4, PORT);// 第一步:需要先幫定 22 m_pUDPReceiver->setMulticastInterface(oNet);// 第二步:指定網卡 23 m_pUDPReceiver->joinMulticastGroup(QHostAddress("224.0.0.100"), oNet);// 第三步:加入到指定網卡的廣播中 24 connect(m_pUDPReceiver, SIGNAL(readyRead()), this, SLOT(receive())); 25 }