QT的UDP组播技术
一 UDP介绍
UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输。适合下面4种情况:
网络数据大多为短消息。
拥有大量客户端。
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高。
二 基于udp协议的c/s编程模型(广播),组播的话,明天再看。
客户端:
class Sender : public QObject
{
Q_OBJECT //可以使用信号和槽
public:
explicit Sender(QObject *parent = );
~Sender();//虚构函数无返回值
void start();
public slots:
void broadcastDatagram(); private:
QUdpSocket *udpSocket;//包含 <QtNetwork/qudpsocket.h>
QTimer *timer;
int messageNo; };
在使用udp tcp时,qt的.pro文件中要加上 QT +=network.
具体实现:
#include "sender.h" Sender::Sender(QObject *parent) :
QObject(parent)
{
timer = new QTimer(this);
udpSocket = new QUdpSocket(this);
connect(timer,SIGNAL(timeout()),this,SLOT(broadcastDatagram()));
messageNo = ;
}
void Sender::start()
{
timer->start();
}
void Sender::broadcastDatagram()
{
qDebug()<<(tr("Begin Broadcast: %1").arg(messageNo));
QByteArray datagram = "BroadCast Message:" + QByteArray::number(messageNo);
udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,);
++messageNo;
} Sender::~Sender()
{
delete timer;
delete udpSocket;//是否删除connect? }
udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444);
函数原型:writeDatagram(const char* data,qint64 size,const QHostAddress &address,quint16 port)
函数功能:将数据包发出
函数参数:数据包自身,数据包大小,发送到的地址,端口。
接收端:
class Receiver : public QObject
{
Q_OBJECT
public:
explicit Receiver(QObject *parent = );
~Receiver();
signals: public slots:
void processPendingDatagrams();
private:
QUdpSocket *udpSocket; };
具体实现:
#include "receiver.h" Receiver::Receiver(QObject *parent) :
QObject(parent)
{
udpSocket = new QUdpSocket(this);
udpSocket->bind();
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
}
void Receiver::processPendingDatagrams()
{
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(),datagram.size());
qDebug() << (tr("Receice Data: \"%1\"").arg(datagram.data()));
}
}
Receiver::~Receiver()
{
delete udpSocket;
}
当接受到数据包时,QUdpSocket会发出readyRead()信号。我关联了processPendingDatagrams()。
先用hasPendingDatagrams()判断是否有可供读取的数据。若有,则用pendingDatagramSize()开辟一个缓冲区。
最后,用readDatagram()将报文读取到缓冲区中。
QT的UDP组播技术的更多相关文章
- 调皮的udp组播技术
2017年本科毕业,经历过千辛万苦的找工作之后,我进入了现在的这家公司.虽是职场小白,但励志成为IT界的一股清流(毕竟开发的妹子少,哈哈).因为公司的业务需要,我负责的部分是利用组播技术实现OSG模型 ...
- IP组播技术介绍及实现例子
引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...
- Android设备一对多录屏直播--(UDP组播连接,Tcp传输)
原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...
- HCNP Routing&Switching之组播技术-组播基础
组播技术背景 随着internet网络的不断发展,网络中交互的各种数据.语音.视频信息数量突增:新型的在线直播.网络电视.视频会议等应用也在逐渐兴起:这些业务大多符合点到多点的模式,对信息安全性.传播 ...
- HCNP Routing&Switching之组播技术PIM-SM RP
前文我们了解了组播技术中,组播路由协议PIM的稀疏模式相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16142795.html:今天我们来聊一聊组播路 ...
- ffmpeg笔记——UDP组播接收总结
ffmpeg在avformat_open_input里面已经实现了UDP的协议,所以只需要设置好参数,将url传递进去就可以了. 和打开文件的方式基本一样: 01 AVCodecContext *pV ...
- IP组播技术
1 概述 1.1 产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...
- C# 使用UDP组播实现局域网桌面共享
最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类 ...
- Android上UDP组播无法接收数据的问题
最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...
随机推荐
- element ui input框不能输入的问题(实时学习)
解决: 在input的上面添加数据v-model 既可以 1.菜单中api (2018年8月14号) :default-active 默认根据当前路由选中菜单,值需要和 el-submenu 的属 ...
- 关于c语言的文法分析问题
<程序> -> <声明> | <程序> <函数> <声明> -> #include<stdio.h>|# ...
- D-Link系列路由器漏洞挖掘入门
D-Link系列路由器漏洞挖掘入门 前言 前几天去上海参加了geekpwn,看着大神们一个个破解成功各种硬件,我只能在下面喊 6666,特别羡慕那些大神们.所以回来就决定好好研究一下路由器,争取跟上大 ...
- SQL语句复习【专题三】
SQL语句复习[专题三] DML 数据操作语言[insert into update delete]创建表 简单的方式[使用查询的结果集来创建一张表]create table temp as sele ...
- Java ==和equals的区别
首先了解默认equals方法实现代码 public boolean equals(Object obj) { return (this == obj); } 1.== (1)对于基本数据类型的变量,& ...
- 基于partition的递归
partition算法可以应用在快速排序算法中,也可以应用到 Selection algorithm(在无序数组中寻找第K大的值) Partition 实现 快速排序中用到的 partition 算法 ...
- QTP(14)
练习1.Flight4a 要求: a.录制Flight4a登录+退出业务流程 b.使用自定义检查结合Exist属性验证登录是否成功 c.为用户名实现参数化 用户名 Jack 正确 Rose 正确 12 ...
- idea中添加mybatis mapper 样例
代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC &quo ...
- R树-javascript代码实现过程分析(插入操作)
R Tree 第一步,创建R树类. 构建一个RTree生成器.用以创建tree对象. 例子:var tree = new RTree(12) var RTree = function(width){ ...
- 初始Ajax学习笔记
前端: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!--引入 ...