天天看点

QT关于UDP通讯设置QT关于UDP通讯设置

QT关于UDP通讯设置

UDP(用户数据报协议)是一个轻量级的,不可靠的、面向数据报的,无连接的协议,用于可靠性不是非常重要的情况。UDP一般分为发送端和接收端。QUdpSocket类用来发送和接收UDP数据报,简单的来说就是“套接字”,“套接字”就是一个IP地址加上一个port端口号。这样使用套接字就可以实现网络上两台主机的两个应用程序之间的通讯。

发送端

首先在.pro文件中添加“ QT  += network”,在头文件下声明#include <QUdpSocket> 再声明一个私有对象:  

QUdpSocket *sender;
           

再在设计界面上放入一个按钮,关联按下槽函数与信号函数。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sender = new QUdpSocket(this);

}

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

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

接收端

首先在.pro文件中添加“ QT  += network”,在头文件下声明#include <QUdpSocket> 再声明一个私有对象:

QUdpSocket *receive;
           

添加一个槽函数;

private slots:
    void processPendingDatagram();
           

主函数:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    receive = new QUdpSocket(this);
    receive->bind(45454,QUdpSocket::ShareAddress);
    connect(receive,&QUdpSocket::readyRead,this,&MainWindow::processPendingDatagram);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::processPendingDatagram()
{
    // 拥有等待的数据报
    while(receive->hasPendingDatagrams())
    {
        QByteArray datagram;
        // 让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
        datagram.resize(receive->pendingDatagramSize());
        // 接收数据报,将其存放到datagram中
        receive->readDatagram(datagram.data(), datagram.size());
        ui->label->setText(datagram);
    }

}
           

其中发送端的QHostAddress::Broadcast来表示广播地址,等价于QHostAddress("255.255.255.255")。端口号可以随意指定的,但是一般使用1024以上的端口。

效果如下:

QT关于UDP通讯设置QT关于UDP通讯设置
Qt

继续阅读