Qt-利用QUdpSocket实现UDP双网卡通信处理
2023-09-14 08:57:11 时间
相关资料:
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主函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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主函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
相关文章
- Qt-Qt使用QWebsocket实现服务端和客户端通信
- Qt-使用QSerialPort实现串口通信
- QT-Qt中MediaPlay的使用,播放视频或MP4
- Qt-char*与QString互转 floatToqstring char*与QString互转 qt字符串与字符串数组操作 Qt 的QString类的使用
- QT Creator有中文出现“常量中有换行符 ”的解决办法
- s3c2410上搭建QT/Embedded4.8.5开发环境(二)--安装arm平台qt库qt-everywhere-opensource-src-4.8.5
- Qt编写的项目作品29-RTSP播放器+视频监控(海康SDK版本)
- Qt编写地图综合应用11-动态添加
- Qt系列文章026-QAudioRecorder音频导入
- Qt系列文章005-开发工具QtCreator
- 用C++的QT写一个能够实现TCP和UDP通信的网络调试助手代码
- Qt QBoxLayout类详解
- Qt QVariant的用法
- Qt Modbus通信(RTU模式)
- Qt-消息对话框的设计
- Qt函数名怎么使用
- QT多线程实战_Qt多线程开发项目
- QT之TCP通信
- Qt QHeaderView 添加复选框
- C++Qt开发——HTTP协议
- 【Qt】在ubuntu上为可执行程序qt创建图标(亲测)
- 3、 QT基础——第一个Qt小程序
- Qt之界面(自定义标题栏、无边框、可移动、缩放)
- Qt+OpenCV:打开显示图像
- vs2015中无法设置Qt版本,qt project setting 是灰色,Qt无法编译ui文件
- qt交叉编译报错::-1: error: The Qt version is invalid: Qt version is not properly installed,please run make
- QT creator使用(二):Qt项目建立、编译、运行、发布及移植