就是塔塔的个人空间 https://www.eechina.com/space-uid-136863.html [收藏] [复制] [RSS]

博客

迅为三星4412开发板UDP实现服务器和客户端

已有 463 次阅读2023-4-27 10:45

UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常
用在传输音视频等数据量非常大的场合。
udp 网络编程只需要使用一个类 QUdpSocket。

本实验中对 QUdpSocket 的基本使用:

1.创建 QUdpSocket 对象。

2.绑定端口号

3.数据到来触发 readyRead()信号。

4.读取发送数据。

5.关闭。

具体步骤:

步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。

步骤二:编写代码

1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号

readyRead(),在绑定的槽函数内去读取数据。

2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长

度,如果数据没有被读取

完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。

readDatagram(data,size);

参数 data 为读取的数据,size 为数据长度。

3.发送数据,使用 writeDatagram 函数,

writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);

Data:发送的数据。

Len:发送的数据长度。

Host:目标 IP 地址。

Port:目标端口号。

4.关闭 socket 套接字。

代码如下:

udp.h

#include <QMainWindow>

#include <QUdpSocket>

namespace Ui {

class Udp;

}

class Udp : public QMainWindow

{

Q_OBJECT

public:

explicit Udp(QWidget *parent = 0); ~Udp();

QUdpSocket * udpSocket;

private slots:

void on_pushButton_clicked();

void readyRead_Slot(void);

void on_pushButton_3_clicked();

void on_pushButton_2_clicked();

private:

Ui::Udp *ui;

};

udp.cpp:

Udp::Udp(QWidget *parent) :

QMainWindow(parent), ui(new Ui::Udp)

{

ui->setupUi(this);

udpSocket = new QUdpSocket(this);

}

Udp::~Udp()

{

delete ui;

}

/*

* 打开按钮

*/

void Udp::on_pushButton_clicked()

{

//绑定本端口的端口号

if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){

QMessageBox::information(this,"提示","成功");

}else{

QMessageBox::information(this,"提示","失败");

}

//绑定数据信号和槽函数

connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));

}

/*

*读取数据槽函数

*/

void Udp::readyRead_Slot()

{

QString buf;

QByteArray array;

//hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取

while(udpSocket->hasPendingDatagrams()){

//获取数据

array.resize(udpSocket->pendingDatagramSize());

udpSocket->readDatagram(array.data(),array.size());

buf = array.data();

ui->recvEdit->appendPlainText(buf);

}

}

/*

* 发送数据

*/

void Udp::on_pushButton_3_clicked()

{

quint16 port;

QString sendBuff;

QHostAddress address;

address.setAddress(ui->ipEdit->text());//目标机地址

port = ui->portEdit->text().toInt();//目标机端口号

sendBuff = ui->sendEdit->text();//发送的数据

//发送

udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);

}

/*

*关闭

*/

void Udp::on_pushButton_2_clicked()

{

udpSocket->close();

}

步骤三:运行测试,收发功能正常如图:

更多内容可以了解迅为三星4412开发板


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部