当前位置: 首页 > news >正文

72-UDP协议工作原理及实战

#ifndef UDPCOMM_H
#define UDPCOMM_H#include <QMainWindow>
#include <QUdpSocket> // 用于发送和接收UDP数据报
#include <QtNetwork>QT_BEGIN_NAMESPACE
namespace Ui { class udpComm; }
QT_END_NAMESPACEclass udpComm : public QMainWindow
{Q_OBJECTpublic:udpComm(QWidget *parent = nullptr);~udpComm();private slots:void on_pushButton_start_clicked();void on_pushButton_stop_clicked();void on_pushButton_sengmsg_clicked();void on_pushButton_broadastmsg_clicked();private:Ui::udpComm *ui;// 自定义函数获取本机的IP地址
public:QUdpSocket *udpsocket;QString GetLocalIpAddress(); // 获取本机IP地址// 自己定义槽
private slots:void  SocketReadyReadData(); // 读取socket传输数据信息
};
#endif // UDPCOMM_H//.c#include "udpcomm.h"
#include "ui_udpcomm.h"
#include <QMessageBox>udpComm::udpComm(QWidget *parent): QMainWindow(parent), ui(new Ui::udpComm)
{ui->setupUi(this);QString strip=GetLocalIpAddress(); // 调用此函数返回对应本机IP地址QMessageBox::information(this,"结果",strip,QMessageBox::Yes);ui->comboBoxtargetip->addItem(strip); // 将IP地址显示到comboBox控件udpsocket=new QUdpSocket(this);connect(udpsocket,SIGNAL(readyRead()),this,SLOT(SocketReadyReadData()));}udpComm::~udpComm()
{delete ui;
}void udpComm::on_pushButton_start_clicked()
{quint16 port=ui->spinBoxbindport->value(); // 本机UDP端口if(udpsocket->bind(port)){ui->plainTextEditdispmsg->appendPlainText("**********绑定成功**********");ui->plainTextEditdispmsg->appendPlainText("$$$$$$$$$$绑定端口$$$$$$$$$$:"+QString::number(udpsocket->localPort()));ui->pushButton_start->setEnabled(false);ui->pushButton_stop->setEnabled(true);}else{ui->plainTextEditdispmsg->appendPlainText("**********绑定失败**********");}
}void udpComm::on_pushButton_stop_clicked()
{udpsocket->abort();ui->pushButton_start->setEnabled(true);ui->pushButton_stop->setEnabled(false);ui->plainTextEditdispmsg->appendPlainText("**********已经停止服务**********");}void udpComm::on_pushButton_sengmsg_clicked()
{QString targetIpAddress=ui->comboBoxtargetip->currentText(); // 获取目标IP地址QHostAddress targetaddress(targetIpAddress);quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容QByteArray str=strmsg.toUtf8();udpsocket->writeDatagram(str,targetaddress,targetport); // 发送数据报信息ui->plainTextEditdispmsg->appendPlainText("[out]:"+str);ui->lineEditmsg->clear(); // 清除编辑框控件内容ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件}void udpComm::on_pushButton_broadastmsg_clicked()
{quint16 targetport=ui->spinBoxtargetport->value(); // 获取端口QString strmsg=ui->lineEditmsg->text(); // 获取发送消息内容QByteArray str=strmsg.toUtf8();udpsocket->writeDatagram(str,QHostAddress::Broadcast,targetport); // 发送数据报信息ui->plainTextEditdispmsg->appendPlainText("[broadcast]:"+str);ui->lineEditmsg->clear(); // 清除编辑框控件内容ui->lineEditmsg->setFocus(); // 将光标焦点定位到编辑框控件
}QString udpComm::GetLocalIpAddress()
{// 根据主机名称,获取IP地址QString strHostName=QHostInfo::localHostName();QHostInfo hostinfo=QHostInfo::fromName(strHostName); //  通过主机名称获取IP地址QString strLocalIp="";QList<QHostAddress> addresslist=hostinfo.addresses(); // IP地址列表if(!addresslist.isEmpty()){for(int i=0;i<addresslist.count();i++){QHostAddress hostaddr=addresslist.at(i);if(QAbstractSocket::IPv4Protocol==hostaddr.protocol()){strLocalIp=hostaddr.toString();break;}}}return strLocalIp;
}void udpComm::SocketReadyReadData()
{// 读取接收到的数据报信息// 用此函数返回true至少有一个数据报需要读取while(udpsocket->hasPendingDatagrams()){QByteArray datagrams;datagrams.resize(udpsocket->pendingDatagramSize());QHostAddress paddress;quint16 pport;// 通过readDatagram()此函数读取数据报,udpsocket->readDatagram(datagrams.data(),datagrams.size(),&paddress,&pport);QString strs=datagrams.data();QString peer="[From:"+paddress.toString()+":"+QString::number(pport)+"]:";ui->plainTextEditdispmsg->appendPlainText(peer+strs);}
}

 

http://www.lryc.cn/news/375912.html

相关文章:

  • 数据结构——顺序表的实现
  • 【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)
  • 重构与优化-优化函数调用(5)
  • 6月18日(周二)A股行总结:A股震荡收涨,车路云概念全日强势,10年、30年国债期货齐创新高
  • 今年的618,似乎很平淡!
  • 嵌入式中间件_3.嵌入式中间件的一般架构
  • Java基础 - 练习(二)打印菱形
  • 链表OJ--超详细解析
  • JavaFX 分隔符
  • mysql安装配置教程(Linux+Windows)
  • MySQL数据库与基本操作(增删改查)
  • 【学习总结】SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)
  • shell脚本编程(概念、编程和语句)
  • 设置角色运动的动画
  • OKR:2024年目标和关键成果常见问题
  • 轻量级 ioc/aop 框架 loveqq 1.0 发布,完全替换掉若依底层 spring 及其 starter
  • 【递归、搜索与回溯】DFS解决FloodFill算法
  • 【Spine学习12】之 事件帧
  • 【C语言习题】31.冒泡排序
  • 【Spring Cloud应用框架】
  • Repetition Improves Language Model Embeddings论文阅读笔记
  • 工具清单 - Bug追踪管理
  • 企业内网是如何禁用U盘的?电脑禁用U盘有哪些方法?
  • 怎样打印微信文档文件?
  • 【讲解下Pip换源】
  • 分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示
  • 后端开发中缓存的作用以及基于Spring框架演示实现缓存
  • Redis原理篇——分布式锁
  • css3多列布局
  • Java开发的构建神器:Maven以及如何安装部署Maven