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

QUdpSocket-Qt使用Udp通讯实现服务端和客户端

版权声明:若无来源注明, Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址: https://www.techieliang.com/2017/12/532/

1. QNetworkDatagram

qt网络报文,可用其建立一个通讯内容包括目标ip、端口号、数据内容。同时接收到的信息也未此类型,可以访问接收数据的长度、发送者的ip及端口等信息

详情请见帮助

QUdpSocket

有Qt提供的udp通讯的类,详细介绍请见官方文档

2. 客户端

注意pro文件要包含QT += network

  1. #include <QHostAddress>
  2. #include <QUdpSocket>
  3. QUdpSocket *m_socket=new QUdpSocket;
  4. m_socket.writeDatagram(msg, QHostAddress::localhost, 8000);

qudpsocket对于发送数据报文提供了三个重载函数:

  1. qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
  2. qint64 writeDatagram(const QNetworkDatagram &datagram)
  3. qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

上面的范例使用的是第三种类型,也可以自行建立QNetworkDatagram对象,修改好内容后直接调用writeDatagram

3. 服务端

服务端与客户端类似,需要先绑定端口“bind”,此函数在QAbstractSocket类中提供

  1. bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)
  2. bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)

具体使用方式:

  1. m_socket = new QUdpSocket;
  2. m_socket->bind(QHostAddress::localhost, 8000);
  3. connect(m_socket, SIGNAL(readyRead()), this, SLOT(receive()));

绑定端口以后,需要将此socket的readyread信号与自定义槽函数连接,当服务端收到消息时会触发此信号。

4. 消息收发

由于udp与tcp不同,不需要三次握手建立连接,所以并不会在连接之后记录当前socket。

发送消息在客户端中已经提供示例

接收消息需要使用Qudpsocket提供以下函数:

  1. qint64 pendingDatagramSize() const
  2. qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
  3. QNetworkDatagram receiveDatagram(qint64 maxSize = -1)

当readyRead信号触发时,可直接通过receiveDatagram函数获取消息报文对象,其内存储消息的发送ip、端口、消息内容等所有信息。

也可以通过pendingDatagramSize判断消息长度,然后通过readDatagram获取消息内容。

在readyRead槽函数中可以先调用QUdpSocket::hasPendingDatagrams判断当前是否有需要读取的消息,若有消息再进行pendingDatagramSize获取需要读取的大小

转载请以链接形式标明本文标题和地址: Techie亮博客 » QUdpSocket-Qt使用Udp通讯实现服务端和客户端

转载于:https://www.cnblogs.com/techiel/p/7978049.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C程序优化
  • [Luogu 3958] NOIP2017 D2T1 奶酪
  • 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)...
  • H.264基础知识总结
  • Msys2的安装,并整合到cmder中
  • cron
  • 参数添加 dynamo
  • Oracle初级——续续篇
  • transient关键字
  • [codeforces] 25E Test || hash
  • python入门----hello world
  • HDU2019数列有序!
  • Kafka无消息丢失配置
  • 人体的数学美思考
  • winfrom 水晶报表制作
  • 2017-08-04 前端日报
  • Angular 4.x 动态创建组件
  • angular组件开发
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 内存分配及垃圾回收机制初探
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python爬虫--- 1.3 BS4库的解析器
  • Selenium实战教程系列(二)---元素定位
  • 初识 webpack
  • 初探 Vue 生命周期和钩子函数
  • 搭建gitbook 和 访问权限认证
  • 好的网址,关于.net 4.0 ,vs 2010
  • 将 Measurements 和 Units 应用到物理学
  • 码农张的Bug人生 - 见面之礼
  • 小程序 setData 学问多
  • 应用生命周期终极 DevOps 工具包
  • nb
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • k8s使用glusterfs实现动态持久化存储
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)构建dubbo分布式平台-平台功能导图
  • (二十三)Flask之高频面试点
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计大学生兼职系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***监测系统的构建(chkrootkit )
  • *Django中的Ajax 纯js的书写样式1
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core 控制台应用程序读取配置文件app.config
  • .net 设置默认首页
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)