像QQ那样,当有很多用户,发送的大部分都是短消息,要求能及时响应,并且对安全性要求不是很高的情况下使用UDP协议。

发送(客户请求发送数据)
很简单,仅需QUdpSocket 的writeDatagram函数即可

[cpp] view plaincopy
  1. void Widget::on_pushButton_clicked()
  2. {   QUdpSocket *sender;
  3. sender = new QUdpSocket(this);
  4. QByteArray datagram = "hello world!";
  5. sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress("192.168.1.100"),45454);
  6. //sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,45454);
  7. // sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::LocalHost,45454);
  8. delete sender;
  9. }

接收(服务器端监听)
使用QUdpSocket 的bind函数监听某个端口
当监听的端口有数据到达时,QUdpSocket 的信号readyRead()就emit,然后在对应的槽函数里使用QUdpSocket 的readDatagram读取数据

void QIODevice::readyRead ()[signal]

This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.

readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).

Note for developers implementing classes derived from QIODevice: you should always emit readyRead() when new data has arrived (do not emit it only because there's data still to be read in your buffers). Do not emit readyRead() in other conditions.

[cpp] view plaincopy
  1. private:
  2. QUdpSocket *receiver;
  3. private slots:
  4. void processPendingDatagram();
[cpp] view plaincopy
  1. receiver = new QUdpSocket(this);
  2. receiver->bind(45454,QUdpSocket::ShareAddress);
  3. connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
[cpp] view plaincopy
  1. void Widget::processPendingDatagram() //处理等待的数据报
  2. {
  3. while(receiver->hasPendingDatagrams())  //拥有等待的数据报
  4. {
  5. QByteArray datagram; //拥于存放接收的数据报
  6. datagram.resize(receiver->pendingDatagramSize());
  7. //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
  8. receiver->readDatagram(datagram.data(),datagram.size());
  9. //接收数据报,将其存放到datagram中
  10. ui->label->setText(datagram);
  11. //将数据报内容显示出来
  12. }
  13. }

用wireshark监听xp 192.168.1.100和虚拟机fedora 192.168.1.103之间的udp数据包,如下
                                      hello world
xp 192.168.1.100------------------------->fedora 192.168.1.103   
(wireshark操作:capture->Options里选择要监视的网卡,然后点Start。可以选择capture/capture filters然后选择udp only过滤一下)

双击进入详细数据

可见udp Frame的层层包裹,
第1层EtherNet II包,记录源MAC和目的MAC等
第2层是IPv4包,记录源ip和目的ip等
第3层是udp包,记录端口等
第4层才是真正的数据,"hello world"

hello world           
fedora 192.168.1.103------------------------->xp 192.168.1.100 
和上面一样的,源和目的ip换了一下

分享到: 

转载于:https://www.cnblogs.com/MingZznet/articles/3211004.html

四十六、Qt网络(六)UDP相关推荐

  1. 第十四章:Qt网络编程

    回顾: 第一章:Qt的概述 第二章:在Ubuntu编写第一个Qt程序 第三章:Qt的字符串和字符编码 第四章:Qt的信号和槽 第五章:Qt容器窗口(父窗口) 第六章:面向对象的Qt编程 第七章:Qt设 ...

  2. Qt笔记(四十)之Qt打开笔记本摄像头

    一.前言 楼主最近开始接触摄像头这一块,发现Qt有封装好的库,于是就想记录相关的学习历程,方便自己查看,该文章只是简单实现了打开摄像头, 截图 关闭摄像头的功能 二.实现过程 1新建工程的时候需要mo ...

  3. 四十六、深入Java的网络编程(下篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  4. 第十六章 网络通信协议探讨

                               第十六章    网络通信协议探讨      LINUX的源代码中属于网络的就有近38万行:我必须先花时间彻底解决网络编程问题,再论其它:所以.其它 ...

  5. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  6. oracle过滤器基础,Oracle培训(四十六)——Servlet第六章知识点总结——过滤器编程...

    Oracle培训(四十六)--Servlet第六章知识点总结--过滤器编程 目标 编写一个过滤器 部署一个过滤器 了解请求和响应包装器 在请求分发器下的过滤器 知识点预览 过滤器 过滤器 1. 什么是 ...

  7. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  9. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  10. 46.深度解密四十六:微信KOl、微博大V等“移动营销资源”全揭秘

    网络营销推广技术.技巧深度解密(四十六)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解移动资源的相关问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律,尊 ...

最新文章

  1. 如何让你的 Linux 系统干净整洁
  2. TF之DNN:利用DNN【784→500→10】对MNIST手写数字图片识别数据集(TF自带函数下载)预测(98%)+案例理解DNN过程
  3. Java标准流输入输出流In(Out)putStream,ReaderWriter等总结(1)
  4. python读文本文件的过程是怎样的_读写文本文件的步骤_Python读写txt文本文件的操作方法全解析...
  5. WebSocket科普
  6. Codeforces 1114C(数论+唯一分解)
  7. 普中科技51单片机——keil的介绍和PZ-ISP无法烧录问题
  8. [UEFI启动教程]移动硬盘安装U盘装机助理(双模式启动)
  9. 项目版本更新,浏览器缓存问题解决方案
  10. 色相环上面的颜色和相邻颜色的关系是什么
  11. element ui表单必填_element-ui设置下拉选择切换必填和非必填
  12. web3调用智能合约取事件
  13. 快速理解Raft之日志复制(肝了两千五百字)
  14. MFC更改对话框的背景色
  15. Qt编写守护程序保证程序一直运行(开源)
  16. SM4加密算法原理和简单实现(java)
  17. 手机录音如何转换成文字?学会这个简单方法,让你事半功倍!
  18. 如何生成题注和表注目录
  19. X-pack 为 Elasticsearch 安全保驾护航
  20. “超男”改“快乐男”,不“超级”也能“快乐”?

热门文章

  1. 并查集 - 交换字符串中的元素
  2. LeetCode每日一题 24. 两两交换链表中的节点
  3. mysql数据库在查询的时候不能使用字段别名,字段别名只在显示的时候显示出来
  4. VS2019项目打包生成.exe文件与Setup的步骤实现
  5. 总线上加三个终端电阻可以吗_汽车维修中CAN总线的常规检修方法!
  6. AbstractListView源码分析8
  7. ant指定servlet版本_阅读SpringMVC源码前,不妨看下简易版本SpringMVC框架的搭建
  8. XML Schema介绍之namespace
  9. Java Process.exitValue Process.waitFor()
  10. Oracle INTERVAL