Qt中Udp通信、Udp广播和组播(QT七)

8 篇文章 2 订阅
本文详细介绍了在Qt环境下如何实现UDP通信,包括发送端和接收端的设置,以及广播和组播的使用。在UDP通信中,数据报的顺序可能与发送顺序不同,适用于实时性强但数据安全性要求不高的场景,如视频传输和音频传输。通过QUdpSocket类,可以创建并操作UDP套接字进行数据发送和接收。在广播和组播中,特定的IP地址用于广播信号,而组播则允许指定地址范围内的多个接收者同时接收数据。
摘要由CSDN通过智能技术生成

一、UDP通信

发送的是数据报, 数据报接收顺序与发送顺序可以不一致,

实时性强,数据安全得不到保证

应用(视频传输, 视频会议, 音频传输)

1.Qt中udp通信QUdpSocket

(1)发送端:

①创建QUdpSocket对象

QUdpSocket msocket;

②调用对象方法发送数据writeDatagram

msocket.writeDatagram(data.toUtf8(),QHostAddress(ip), port.toUShort());

(2)接收端:

①创建QUdpSocket对象

QUdpSocket msocket;

②绑定

msocket.bind(QHostAddress::AnyIPv4, port.toUShort());

③当QUdpSocket对象有数据可读的时候会发送readyRead信号 (发送者, 什么时候, 槽函数)

connect(&msocket, &QUdpSocket::readyRead,this, &UdpRecv::read_data);

④在信号关联的槽函数中调用对象方法接收数据readDatagram

char  array[1024]={0};//保存数据
msocket.readDatagram(array, 1024);

2.Udp通信广播

192.168.1.255 组播224.0.0.0
在这里插入图片描述

(1)app端UdpApp

①创建QUdpSocket对象

QUdpSocket msocket;

②发送广播 -> (端口要预先与控制器固定9999)

msocket.writeDatagram(data.toUtf8(),QHostAddress(广播地址), 9999);

③接收到控制器反馈ip -> 当msock有数据可读的时候会发送readyRead信号

connect(&msocket,&QUdpSocket::readyRead,this,&AppWin::get_ip);

(2)控制器端UdpControl

①创建QUdpSocket

QUdpSocket msocket;

②绑定地址(端口号预先与app固定9999)

msocket.bind(QHostAddress::AnyIPv4, port.toUShort());

③接收广播数据–反馈控制器ip地址(当QUdpSocket对象有数据可读的时候会发送readyRead信号)

    //关联读数据信号readyRead--接收广播数据
    connect(&msocket, &QUdpSocket::readyRead, this, &UdpControl::recv_broadcast);
    QHostAddress appaddr;
    quint16 port;
    QByteArray array; //要另外分配空间
    qint64 size = msocket.bytesAvailable();//获取当前有多少字节数据可读
    array.resize(size);//分配空间
    msocket.readDatagram(array.data(),array.size(),&appaddr, &port);
    //给发送方回馈数据--给app端发送数据
    msocket.writeDatagram("ip",3, appaddr, port);

3.Udp通信组播

224.0.0.0 ---- 239.255.255.255

(1)组播发送端:

①创建QUdpSocket

QUdpSocket msocket;

②发送数据到组播地址

msocket.writeDatagram(data.toUtf8(),//要发送的数据
QHostAddress(ui->ipEdit->text()),//组播地址
ui->portEdit->text().toUShort());//端口号

(2)组播接收端:

①创建QUdpSocket

QUdpSocket msocket;

②绑定

msocket.bind(QHostAddress::AnyIPv4, port.toUShort());

③在槽函数中读取数据 -----当QUdpSocket对象有数据可读的时候会发送readyRead信号)

connect(&msocket, &QUdpSocket::readyRead, this, &MultiCastRecv::recv_multicast);
QHostAddress appaddr;
quint16 port;
QByteArray array; //要另外分配空间
qint64 size = msocket.bytesAvailable();//获取当前有多少字节数据可读
array.resize(size);//分配空间
msocket.readDatagram(array.data(),array.size(),&appaddr, &port);
//给发送方回馈数据--给app端发送数据
msocket.writeDatagram("ip",3, appaddr, port);

(3)如果要接收组播数据

添加到组播组

//获取组播地址
QString multiAddress = ui->ipEdit->text();
//加入组播组
if(msocket.joinMulticastGroup(QHostAddress(multiAddress)))
{
    //把地址添加到列表中去
    ui->listWidget->addItem(multiAddress);
}
else
{
    qDebug()<<"加入失败";
}

(4)如果不想接收组播数据

离开组播组

QString multiAddress = item->text();
if(msocket.leaveMulticastGroup(QHostAddress(multiAddress)))
{
     delete item;
}
else
{
     qDebug()<<"退出失败";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值