Qt利用QUdpSocket實現雙網卡通信處理


 

相關資料:

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 }
View Code

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 }
View Code

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM