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 }
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 }
作者:疯狂Delphi
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
欢迎关注我,一起进步!扫描下方二维码即可加我