1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=61

说明:UDP是面向无连接的,客户端并不与服务器不建立连接,直接向服务器发送数据,服务器端也不从客户端接收连接,只负责调用接收函数,等待客户端连接的到达。

udp通信模型如下:

 (1)服务器端

1)创建套接字;

2)绑定套接字;

3)接收或发送数据;

4)关闭连接。

(2)客户端

1)创建套接字;

2)接收或发送数据;

3)关闭连接。

2  测试说明

(1)基本udp测试

功能:创建一个窗口,使用127.0.0.1:8888进行回环测试,自发自收。

实现步骤:

创建套接字并绑定端口,不指定ip:

1     QUdpSocket *udpsocket = NULL;
2 //创建套接字,指定父对象
3 udpsocket = new QUdpSocket(this);
4 //绑定
5 udpsocket->bind(8888);

送数据:

 1     //先获取对方的ip和端口
2 QString ip = ui->lineEdit_ip->text();
3 qint16 port = ui->lineEdit_port->text().toInt();
4 //获取编辑区内容
5 QString str = ui->textEdit_send->toPlainText();
6 if (str.isEmpty()) {
7 return;
8 }
9 //给指定的IP发送数据
10 udpsocket->writeDatagram(str.toUtf8(), QHostAddress(ip), port);

接收数据:

 1     //当对方成功发送数据过来,会自动触发readyRead()信号
2 connect(udpsocket, &QUdpSocket::readyRead,
3 [=](){
4 //读取对方发送的数据
5 char buf[1024] = {0};
6 QHostAddress cli_addr; //对方地址
7 quint16 port; //对方端口
8 qint64 len = udpsocket->readDatagram(buf, sizeof(buf), &cli_addr, &port);
9 if (len > 0) {
10 //格式化[192.168.2.2:8888]aaaa
11 QString str = QString("[%1:%2] %3").arg(cli_addr.toString()).arg(port).arg(buf);
12 //给编辑区设置内容
13 ui->textEdit_recv->append(str);
14 }
15 }
16 );

完整代码如下:

widget.h

 1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QUdpSocket>
6
7 namespace Ui {
8 class Widget;
9 }
10
11 class Widget : public QWidget
12 {
13 Q_OBJECT
14
15 public:
16 explicit Widget(QWidget *parent = 0);
17 ~Widget();
18
19 private slots:
20 void on_pushButton_send_clicked();
21
22 void on_pushButton_close_clicked();
23
24 private:
25 Ui::Widget *ui;
26 QUdpSocket *udpsocket = NULL;
27 };
28
29 #endif // WIDGET_H

widget.cpp

 1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QHostAddress>
4
5 Widget::Widget(QWidget *parent) :
6 QWidget(parent),
7 ui(new Ui::Widget)
8 {
9 ui->setupUi(this);
10 setWindowTitle("服务器端口为:8888");
11
12 //创建套接字,指定父对象
13 udpsocket = new QUdpSocket(this);
14 //绑定
15 udpsocket->bind(8888);
16 //当对方成功发送数据过来,会自动触发readyRead()信号
17 connect(udpsocket, &QUdpSocket::readyRead,
18 [=](){
19 //读取对方发送的数据
20 char buf[1024] = {0};
21 QHostAddress cli_addr; //对方地址
22 quint16 port; //对方端口
23 qint64 len = udpsocket->readDatagram(buf, sizeof(buf), &cli_addr, &port);
24 if (len > 0) {
25 //格式化[192.168.2.2:8888]aaaa
26 QString str = QString("[%1:%2] %3").arg(cli_addr.toString()).arg(port).arg(buf);
27 //给编辑区设置内容
28 ui->textEdit_recv->append(str);
29 }
30 }
31 );
32 }
33
34 Widget::~Widget()
35 {
36 delete ui;
37 }
38
39 void Widget::on_pushButton_send_clicked()
40 {
41 //先获取对方的ip和端口
42 QString ip = ui->lineEdit_ip->text();
43 qint16 port = ui->lineEdit_port->text().toInt();
44 //获取编辑区内容
45 QString str = ui->textEdit_send->toPlainText();
46 if (str.isEmpty()) {
47 return;
48 }
49 //给指定的IP发送数据
50 udpsocket->writeDatagram(str.toUtf8(), QHostAddress(ip), port);
51 }
52
53 void Widget::on_pushButton_close_clicked()
54 {
55 close();
56 }

运行测试:

(2)UDP广播

概念:使用UDP广播,局域网内的其它UDP用户全部可以收到广播的消息。UDP广播只能在局域网范围内使用。

Qt中在使用writeDatagram()函数发送数据的时候,将第二个参数设置为广播地址QHostAddress::Broadcast就表示UDP广播。

(3)UDP组播

当我们需要发送消息给某些特定用户,或者只接收某些特定用户的消息时,可以使用组播进行实现。

组播地址有:

  • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
  • 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
  • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
  • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

Qt中注册加入到组播地址需要使用QUdpSocket类的成员函数joinMulticastGroup()。

更改上面的代码的bind和加入joinMulticastGroup()函数:

1     //用主播,主要使用ipv4地址
2 udpsocket->bind(QHostAddress::AnyIPv4, 8888);
3 //加入某个组播,组播地址是D类地址
4 udpsocket->joinMulticastGroup(QHostAddress("224.0.0.2"));

测试:

Qt-udp通信的更多相关文章

  1. Qt下实现简单的UDP通信

    本人呢还是小实习生一枚,刚一脚踏进社会大母亲的怀抱,不想找工作的时候碰到的全是培训机构... 不过还是幸运的进了一家...咳咳,国企?!好吧,其实是国企下面的一个分出来的小公司(正在起步中,算是创业公 ...

  2. QT之UDP通信

    前言:前一篇讲了TCP通信,这篇来看看UDP通信. 这里说明一下,UDP通信中分为三种通信分别为单播.组播和广播,下面将一一为大家介绍. 同样的我们都需要在工程文件中添加network QT += c ...

  3. qt在windows下的udp通信(最简单)

    qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发 ...

  4. 套接字、UDP通信、TCP通信、TCP/IP协议簇

    一.套接字(socket) 1.英语单词socket:n.插座:穴:v.插入插座 2.套接字就是源IP地址和目的IP地址.源端口号和目的端口号的组合,是通过传输层进行通信的.IP指定电脑,端口指定某一 ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  7. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  8. 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  9. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  10. HP-SOCKET TCP/UDP通信框架库解析

    项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...

随机推荐

  1. Spark3.0 Standalone模式部署

    之前介绍过Spark 1.6版本的部署,现在最新版本的spark为3.0.1并且已经完全兼容hadoop 3.x,同样仍然支持RDD与DataFrame两套API,这篇文章就主要介绍一下基于Hadoo ...

  2. 当服务器间通讯出现No route to host(Host unreachable)

    服务器间通讯出现No route to host(Host unreachable) 背景:因为某些原因,主机房服务器集体重启,其中部署的系统也需要重启,负责的系统是五台服务器,两台用来作为应用的应用 ...

  3. 力扣14(java)-最长公共前缀(简单)

    题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:strs = ["flower"," ...

  4. 力扣394(java)-字符串解码(中等)

    题目: 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数 ...

  5. 关于CDN的原理、术语和应用场景那些事

    关于CDN,想必你一定看过很多官方的解释.今天,CDN百科第七期,将用一篇3844字的文章,来带你了解CDN的诞生.术语.原理.特征以及应用场景,看完这篇文章,相信你将会对CDN这项互联网基础设施有更 ...

  6. 阿里云数字化安全生产平台 DPS V1.0 正式发布!

    ​简介:数字化安全生产平台则帮助客户促进业务与 IT 的全面协同,从业务集中监控.业务流程管理.应急指挥响应等多维度来帮助客户建立完善专业的业务连续性保障体系. 作者:银桑.比扬 阿里云创立于 200 ...

  7. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

    ​简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选.不过 Jenkins 存在维护成本高.配置复杂等缺点,云效 Flow 较好地解决了这些问题. 本 ...

  8. KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪

    ​简介:欢迎更多的用户试用 KubeDL,并向我们提出宝贵的意见,也期待有更多的开发者关注以及参与 KubeDL 社区的建设! 作者:陈裘凯( 求索) 前言 KubeDL 是阿里开源的基于 Kuber ...

  9. 业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!

    ​简介: Inclavare Containers 通过云原生计算基金会(CNCF)TOC 投票正式成为 CNCF 官方沙箱项目. 作者|彦荣 ​ 2021 年 9月 15 日,Inclavare C ...

  10. Istio微服务入门---通过istio部署微服务实现灰度发布(15)

    一.Istio简介 1.1 Istio介绍 官方文档:https://istio.io/docs/concepts/what-is-istio/ 中文官方文档:https://istio.io/zh/ ...