文章目录

  • 概要:本期主要讲解QT中对UDP协议通信的实现。
  • 一、UDP协议通信
  • 二、Qt中UDP协议的处理
    • 1.QUdpSocket
  • 三、Qt实现UDP通信
    • 1.客户端
    • 2.服务器端
  • 结尾

概要:本期主要讲解QT中对UDP协议通信的实现。

一、UDP协议通信

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 描述了 UDP。

UDP协议根据消息传送模式可以分为:单播(Unicast)、组播(Multicast)和广播(Broadcast)。

  1. 单播:一个UDP客户端发出的数据报只发送到另一个指定地址和端口的UDP客户端,是一对一的数据传输。
  2. 组播:也称多播,UDP客户端加入到另一个组播IP地址指定的多播组,成员向组播地址发送的数据报组内成员都可以接收到,类似于QQ群功能。
  3. 广播:一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以收到。

二、Qt中UDP协议的处理

Qt中提供了QUdpSocket类用于创建UDP套接字。

1.QUdpSocket

QUdpSocket类继承于QAbstractSocket,提供了UdpSocket套接字的创建、连接对位服务器、加组等。

三、Qt实现UDP通信

UDP通信是对等服务器间信息传递,其实不需要指定客户端和服务器端,但是为了便于理解,我在实现时仍然采用C-S的结构。
实现步骤如下:
创建UDP套接字 --> 绑定端口 --> 加组(区分消息传送模式) -->发送数据(区分消息传送模式) --> 接受数据

1.客户端

客户端实现发送数据。

#ifndef UDPCLIENT_H
#define UDPCLIENT_H#include <QObject>
#include <QHostAddress>
#include <QUdpSocket>
#include <QDebug>
#include <QTimer>class UDPClient :QObject
{Q_OBJECT
public:UDPClient();void InitSocket();//初始化UDP套接字void InitTimer();//初始化定时器public slots:void SendData();//发送数据private:QUdpSocket *mUdpSocket;//UDP套接字对象QHostAddress mGroupAddress;//组播地址QTimer *mTimer;//定时器对象int mType;//记录UDP消息传送模式 0:单播 1:广播 2:组播(多播)
};#endif // UDPCLIENT_H
#include "udpclient.h"UDPClient::UDPClient()
{//    mType = 0;//Unicast
//    mType = 1;//BroadcastmType = 2;//MulticastInitSocket();InitTimer();}void UDPClient::InitSocket()
{mUdpSocket = new QUdpSocket;//初始化socketmGroupAddress.setAddress("239.2.2.222");//设置组播地址mUdpSocket->bind(6666);//绑定端口号if(mType == 2){//组播的数据的生存期,数据报没跨1个路由就会减1.表示多播数据报只能在同一路由下的局域网内传播mUdpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);}
}void UDPClient::InitTimer()
{mTimer = new QTimer;//初始化定时器connect(mTimer,&QTimer::timeout,this,[=]{SendData();});mTimer->start(1000);//每隔一秒发送一次数据
}void UDPClient::SendData()
{QByteArray _data = "hello";if(mType == 0)//单播{QHostAddress _peerHostAddress = QHostAddress("10.0.0.177");//对位服务器IPquint16 _port = 6666;//对位服务器端口if(-1 !=mUdpSocket->writeDatagram(_data.data(),_data.size(),_peerHostAddress,_port)){qDebug()<< "Unicast ==> Send data : "<< _data<<endl;}mUdpSocket->flush();}else if(mType == 1)//广播{quint16 _port = 6666;//广播端口if(-1 !=mUdpSocket->writeDatagram(_data.data(),QHostAddress::Broadcast,_port)){qDebug()<< "Broadcast ==> Send data : "<< _data<<endl;}mUdpSocket->flush();}else if(mType == 2)//组播{quint16 _port = 8888;//组播端口if(-1 != mUdpSocket->writeDatagram(_data.data(),mGroupAddress,_port)){qDebug()<< "Multicast ==> Send data : "<< _data<<endl;}mUdpSocket->flush();}else{qDebug()<< "mType is error! "<<endl;return;}}

2.服务器端

服务器端实现数据的接收。

#ifndef UDPSERVER_H
#define UDPSERVER_H#include <QObject>
#include <QHostAddress>
#include <QUdpSocket>
#include <QDebug>class UDPServer : QObject
{Q_OBJECT
public:UDPServer();void InitSocket();//初始化套接字public slots:void ReadPendingDataframs();//读取消息private:QUdpSocket *mUdpSocket;//UDP套接字QHostAddress mGroupAdress;//组播地址int mType; //记录UDP消息传送模式 0:单播 1:广播  2:组播(多播)
};#endif // UDPSERVER_H
#include "udpserver.h"
UDPServer::UDPServer()
{//    mType = 0;//Unicast
//    mType = 1;//BroadcastmType = 2;//MulticastInitSocket();}void UDPServer::InitSocket()
{//初始化socket,设置组播地址mUdpSocket = new QUdpSocket;mGroupAdress.setAddress("239.2.2.222");if(mType == 0 || mType == 1){//绑定本地IP和端口号mUdpSocket->bind(6666);}else if(mType == 2){if(mUdpSocket->bind(QHostAddress::AnyIPv4,8888,QUdpSocket::ShareAddress)){//加入组播地址mUdpSocket->joinMulticastGroup(mGroupAdress);qDebug()<<("Join Multicast Adrress [")<<mGroupAdress.toString()<<("] Successful!")<<endl;}}else{qDebug()<< "mType is error! "<<endl;return;}connect(mUdpSocket,&QUdpSocket::readyRead,this,[=]{ReadPendingDataframs();});
}void UDPServer::ReadPendingDataframs()
{QByteArray _data;_data.resize(mUdpSocket->pendingDatagramSize());if(mType == 0)//Unicast{QHostAddress *_peerHostAddress = new QHostAddress("10.0.0.32");quint16 _port = 6666;while(mUdpSocket->hasPendingDatagrams()){mUdpSocket->readDatagram(_data.data(),_data.size(),_peerHostAddress,&_port);//接收指定IP和端口的udp报文qDebug()<<"Unicast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;}}else if(mType == 1)//Broadcast{QHostAddress _peerHostAddress;quint16 _port;while(mUdpSocket->hasPendingDatagrams()){mUdpSocket->readDatagram(_data.data(),_data.size(),&_peerHostAddress,&_port);//接收同一子网的udp报文qDebug()<<"Broadcast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;}}else if(mType == 2)//Multicast{QHostAddress _peerHostAddress;quint16 _port;while(mUdpSocket->hasPendingDatagrams()){mUdpSocket->readDatagram(_data.data(),_data.size(),&_peerHostAddress,&_port);//接收同组的udp报文qDebug()<<"Multicast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;}}else{qDebug()<< "mType is error! "<<endl;return;}
}

结尾

以上就是QT实现UDP协议通信的全部内容了,记得加上network模块:)

【QT网络编程】实现UDP协议通信相关推荐

  1. 【QT实现TCP和UDP协议通信(二)】

    QT实现TCP和UDP协议通信(二) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

  2. 【QT实现TCP和UDP协议通信(一)】

    QT实现TCP和UDP协议通信(一) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

  3. 基于ZYNQ-7000的AI加速器设计之PS端(ARM)网络编程(UDP协议)

    1.开始前的准备工作 关闭电脑防火墙 连接开发板电源 开发板与PC之间串口连接,JTAG下载线连接 PC机与开发板间网线连接,并保证能ping通 2.Vivado端配置 创建工程,具体步骤不详细介绍, ...

  4. step5 . day4 网络编程 基于UDP协议的网络编程流程及API

    UDP协议是面向无连接,不可靠的传输协议,编程流程如下; 服务器端: 1. socket(),返回一个文件描述符,用于通信 2. bind(); //得先完成结构体的填充sockaddr_in 3. ...

  5. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socketsk = socket. ...

  6. 网络编程---tcp/udp协议

    协议使用场景: udp协议(User Datagram Protocol) 即时通讯类的软件 :qq 微信 飞信 歪歪 tcp协议(Transmission Control Protocol) 发邮件 ...

  7. QT 网络编程(UDP版本)

    QT的UdpSocket接收消息使用原则 第一步:new一个UdpSocket 第二步:调用UdpSocket的bind方法,同时指定端口号 第三步:使用connect将接收消息函数和UdpSocke ...

  8. Java网络编程——基于UDP协议的聊天室

    UDP简述    UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议.它为应用程序提供了一种无需建立连接就可以发送封 ...

  9. step5 . day5 网络编程 基于UDP协议的多人网络在线聊天功能

    模拟在线群聊功能,使用多进程完成聊天内容的接受和服务器端的转发,demo代码记录参考 //client_chat_UDP code #include <stdio.h> #include ...

最新文章

  1. 微信8.0大更新,6大新功能加入!未来还将引入自己的输入法!
  2. 网络:TCP粘包问题?如何解决?
  3. JAVA总结之数组篇
  4. WebView三个方法区别(解决乱码问题)
  5. 作者:赵江华(1989-),女,中国科学院计算机网络信息中心研究实习员
  6. alan turing_Turing Machine交互式模拟器如何帮助您理解算法
  7. 2021数学建模B题详细思路
  8. idea 安装Vue插件 超详细
  9. 电脑键盘各按键的作用及常用的快捷键总结
  10. 数据分析师为什么能拿高薪
  11. 从零开始学习 JD Chain(二)- JD Chain 区块链浏览器
  12. CM源码(CyanogenMod)源码编译
  13. compass项目配置文件config.rb
  14. Linux 查看usb设备信息
  15. 20162316刘诚昊 第五周作业
  16. 读书 | 《富爸爸穷爸爸》
  17. 中科蓝讯AB536X系列芯片PWM使用说明
  18. 分布式调度框架Elastic-Job
  19. C#调用百度api,根据经度和纬度获取地理位置信息
  20. 计算机毕业设计Java微博系统网站(源码+系统+mysql数据库+Lw文档)

热门文章

  1. C++实现Socket连接通信
  2. 7-23 币值转换 (20 分)
  3. ​Au入门系列之二:波形编辑
  4. mac pro m1:安装dump文件内存分析工具——MAT
  5. 循环进行Bitmap转BitmapSource导致内存溢出时可使用使用DeleteObject来释放资源
  6. SelectObject和DeleteObject 函数
  7. 最小二乘、加权最小二乘 matlab实现
  8. Matlab中结构体struct创建和使用
  9. java求素数的方式
  10. 移动互联网APP运营技巧分享