一、UDP簡(jiǎn)介
1)UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
UDP是一個(gè)輕量級(jí)、不可靠、面向數(shù)據(jù)報(bào)的、無連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會(huì)議等等。
2)Qt中QUdpSocket類繼承自QAbstractSocket,用來發(fā)送和接收UDP數(shù)據(jù)報(bào),”Socket”即套接字,套接字即IP地址+端口號(hào)。其中IP地址指定了網(wǎng)絡(luò)中的一臺(tái)主機(jī),二端口號(hào)則指定了該主機(jī)上的一個(gè)應(yīng)用程序,端口號(hào)只具有本地意義,使用套接字即可實(shí)現(xiàn)網(wǎng)絡(luò)上的兩個(gè)應(yīng)用程序之間的通信。
3)QUdpSocket支持IPv4廣播,要廣播數(shù)據(jù)報(bào),則只需發(fā)送到一個(gè)特殊的地址QHostAddress::Broadcast(即255.255.255.255),數(shù)據(jù)報(bào)一般建議發(fā)送字節(jié)數(shù)小于512字節(jié)。端口號(hào)選擇1024-65535(1024以下的常用作保留端口號(hào),如FTP常用端口號(hào)21,Telnet常用端口號(hào)23,DNS域名服務(wù)器常用端口53等)。
————————————————
版權(quán)聲明:本文為CSDN博主「喝水怪~」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_43686329/article/details/120352026
二:代碼實(shí)現(xiàn)
udpwidget.h
#ifndef UDPWIDGET_H
#define UDPWIDGET_H
#include <QtWidgets>
#include <QUdpSocket>
namespace Ui {
class UdpWidget;
}
class UdpWidget : public QWidget
{
Q_OBJECT
public:
explicit UdpWidget(QWidget *parent = 0);
~UdpWidget();
private:
Ui::UdpWidget *ui;
QUdpSocket *udpSocket;
QHostAddress sender;
quint16 senderPort;
private slots:
void readPendingDatagrams();
void on_pushButton_clicked();
};
#endif // UDPWIDGET_H
udpwidget.cpp
#include "udpwidget.h"
#include "ui_udpwidget.h"
UdpWidget::UdpWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::UdpWidget)
{
ui->setupUi(this);
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::LocalHost, 7755);
//客戶端發(fā)送數(shù)據(jù)后觸發(fā)readyRead
connect(udpSocket, SIGNAL(readyRead()),
this, SLOT(readPendingDatagrams()));
}
UdpWidget::~UdpWidget()
{
delete ui;
}
void UdpWidget::readPendingDatagrams()
{
//只要緩沖區(qū)有數(shù)據(jù),那么就不斷的讀取然后處理
while (udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
//把緩沖區(qū)的大小重設(shè)為待讀取的數(shù)據(jù)的大小
datagram.resize(udpSocket->pendingDatagramSize());
//datagram.data()是把QByteArray轉(zhuǎn)為char *
//sender代表發(fā)送端的IP地址,senderPort代表發(fā)送端的端口
udpSocket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
//業(yè)務(wù)邏輯
ui->recvEdit->setText(QString::fromLocal8Bit(datagram));
}
}
void UdpWidget::on_pushButton_clicked()
{
QString str = ui->sendEdit->toPlainText();
udpSocket->writeDatagram(str.toLocal8Bit(), sender, senderPort);
}
界面文件
文章來源:http://www.zghlxwxcb.cn/news/detail-677476.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-677476.html
到了這里,關(guān)于QT實(shí)現(xiàn)UDP通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!