Qt网络编程 (udp广播和接收例)

概述

使用两个项目

  • 1 sender 用来广播"hello world";
  • 2 receiver 用来接收广播信息

sender

  • 1 创建Qdialog类
  • 2 在sender.pro 中添加 QT +=network 一行代码
  • 3 在sender.h 中声明类
    • class QUdpSocket;
    • 在声明一个私有对象
    • QUdpSocket *sender;
  • 4 在ui界面拖入一个按钮 用来触发广播信息
    其槽函数如下
void Sender::on_pushButton_clicked()
{
    QByteArray datagram = "hello world";
    sender->writeDatagram(datagram.data(),datagram.size(),
                          QHostAddress::Broadcast,45454);
}
/*
首先,定义了一个QByteArray类型的变量datagram,其中存储了字符串"hello world"的字节流。

然后,调用了sender对象的writeDatagram函数,该函数用于发送UDP数据报。具体参数含义如下:

 datagram.data():获取datagram的数据指针,用于发送数据。
 datagram.size():获取datagram的数据大小,用于指定发送数据的长度。
 QHostAddress::Broadcast:指定目标主机地址为广播地址,表示将数据发送给局域网内的所有主机。
 45454:指定目标主机端口号,表示将数据发送到该端口号对应的进程。
 
总体来说,这段代码的作用是向局域网内的所有主机发送一个UDP数据报,数据内容为"hello world"。
*/

在sender.cpp 构造函数中添加

 sender= new QUdpSocket(this);

receiver

  • 1 创建Qdialog类
  • 2 在receiver.pro 中添加 QT +=network 一行代码
  • 3 在receiver.h 中声明类
    • class QUdpSocket;
    • 在声明一个私有对象
      • QUdpSocket *sender;
    • 添加一个私有槽函数
      • private slots:
      • void processPendingDatagram();
  • 4 在ui界面拖入一个label 用来显示接收广播信息
    其槽函数如下
void Receiver::processPendingDatagram(){
    while(receiver->hasPendingDatagrams()){
        QByteArray datagram;
        datagram.resize(receiver->pendingDatagramSize());
        receiver->readDatagram(datagram.data(),datagram.size());
        ui->label->setText(datagram);
    }
}
  • 5绑定
 receiver->bind(45454,QUdpSocket::ShareAddress);
 connect(receiver,&QUdpSocket::readyRead,
            this,&Receiver::processPendingDatagram);
/*

这段代码是一个初始化和连接信号和槽的操作。

首先,调用了receiver对象的bind函数,该函数用于将接收端口绑定到45454端口上,并且设置了QUdpSocket::ShareAddress选项,表示该端口可以被多个进程共享。

然后,使用connect函数将receiver对象的readyRead信号与当前对象(Receiver类的实例)的processPendingDatagram槽函数连接起来。readyRead信号表示接收到新的数据报,而processPendingDatagram槽函数用于处理接收到的数据报。

总体来说,这段代码的作用是初始化一个UDP接收器,并将其绑定到指定的端口号上。同时,将接收到新数据报的信号与处理数据报的槽函数连接起来,以便在接收到新数据报时能够及时处理。
*/
//sender.cpp 发送端
#include "sender.h"
#include "ui_sender.h"
#include <QtNetwork>
Sender::Sender(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Sender)
{
    ui->setupUi(this);
    sender= new QUdpSocket(this);
}

Sender::~Sender()
{
    delete ui;
}

void Sender::on_pushButton_clicked()
{
    QByteArray datagram = "hello world";
    sender->writeDatagram(datagram.data(),datagram.size(),
                          QHostAddress::Broadcast,45454);
}

演示

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

牛郎恋刘娘,刘娘念牛郎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值