草庐IT

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

Java.L 2023-07-17 原文

目录

一、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()<<"退出失败";
}

有关Qt中Udp通信、Udp广播和组播(QT七)的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  5. ruby-on-rails - Rails 是否支持监听 UDP 套接字的简洁方式? - 2

    在Rails中,什么是集成更新模型某些元素的UDP监听过程的最佳方式(特别是它将向其中一个表添加行)。简单的答案似乎是在同一个进程中使用UDP套接字对象启动一个线程,但我什至不清楚我应该在哪里做适合Rails方式的事情。有没有一种巧妙的方法来开始收听UDP?具体来说,我希望能够编写一个UDPController并在每个数据报消息上调用一个特定的方法。理想情况下,我希望避免在UDP上使用HTTP(因为它会浪费一些在这种情况下非常宝贵的空间),但我完全控制消息格式,因此我可以为Rails提供它需要的任何信息。 最佳答案 Rails是一个

  6. 1个串口用1根线实现多机半双工通信+开机控制电路 - 2

    功能需求:主机使用一个串口,与两个从机进行双向通信,主机向从机发送数据,从机能够返回数据,由于结构限制,主机与从机之间只有3根线(电源、地、数据线),并且从机上没有设物理的电源开关,需要通过与主机连接的数据线来控制开机,总结如下:1、数据线只有1根2、能够双向通信3、主机能够控制从机开机4、主机可以单独向1个从机发数据,也可以同时向两个从机发送数据根据需求,设计出如下电路:工作原理分析:VCC_24V_IN、GND、LINE_L(LINE_R)三根线接线连接到从机,电源开启电路是从机内部的电源控制。开机的逻辑:*主机先上电,LINE_L因为主机的R1上拉而有高电平,使Q6导通,Q5的G极电压被

  7. ruby - 如何创建与帧缓冲区通信的 Ruby 应用程序? - 2

    我有一个RaspberryPiTFT7"触摸屏显示器,我想创建一个简单的应用程序来显示和输出系统数据(即CPU使用率、温度等)。我注意到目前常见的实现方法是使用pygame库输出到显示器连接到的帧缓冲区/dev/fb1。我想执行相同的操作,但使用Ruby,因为我更熟悉这门语言。有人可以为我指明正确的方向,让我知道如何开始吗?我查看了ruby​​game和gosu库,它们似乎能够做我想做的事情,即绘制屏幕,​​但我找不到任何关于如何将输出定向到的信息帧缓冲区本身。 最佳答案 rubycorelib有一个IO您应该能够使用该类将输出定向

  8. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  9. ruby - 后台工作人员在 Rails 应用程序中查看通信 - 2

    假设我有一个包含帖子的博客应用程序。创建帖子后,将创建一个工作人员来处理一些后台操作。我的情况是,在提交表单后我想显示某种加载消息(gif加载器等),当工作人员完成时我想隐藏加载消息并显示工作人员提供的一些数据。我的问题是,传达工作人员已完成工作并将其显示在用户前端的最佳方式是什么。worker回调看起来像这样defworker_finish#messagetheuserend 最佳答案 我认为您可能忽略了拥有后台工作人员的意义,基本上,您试图做的是弄巧成拙。--如果用户提交表单并且你在你的Controller中排队作业,只是为了让

  10. ruby - 为什么在使用 savon 进行 ruby​​ soap 通信时将 "wsdl"命名空间插入到操作名称中? - 2

    我正在尝试访问我无法控制的SOAP服务。其中一个操作称为ProcessMessage。我按照这个例子生成了一个SOAP请求,但我收到一条错误消息,指出该操作不存在。我将问题追溯到生成信封正文的方式。USER658e702d5feff1777a6c741847239eb5d6d86e482010-02-18T02:05:25Zpassword......ProcessMessage标签应该是:这就是示例Java应用程序生成它时的样子,并且可以正常工作。该标记是我的Ruby应用程序生成的内容与示例Java应用程序之间的唯一区别。有什么方法可以去掉那个标签前面的"wsdl:"命名空间并添加这

随机推荐