Qt-利用QUdpSocket实现UDP双网卡通信处理

 

相关资料:

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

 

 

posted on 2021-08-13 08:57  疯狂delphi  阅读(1657)  评论(1编辑  收藏  举报

导航