国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt之UDP通信

這篇具有很好參考價(jià)值的文章主要介紹了Qt之UDP通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、UDP簡(jiǎn)介

二、QUdpSocket類

三、UDP服務(wù)器

四、UDP客戶端

五、代碼

1.udp服務(wù)端

2.udp客戶端


一、UDP簡(jiǎn)介

UDP(User Datagram Protocol 即用戶數(shù)據(jù)報(bào)協(xié)議)是一個(gè)輕量級(jí)的,不可靠的,面向數(shù)據(jù)
報(bào)的無(wú)連接協(xié)議
。由于 UDP 的特性:它不屬于連接型協(xié)議,因而具有資源消耗小,處理速度快的優(yōu)點(diǎn),所以通常音頻、視頻和普通數(shù)據(jù)在傳送時(shí)使用 UDP 較多,因?yàn)樗鼈兗词古紶杹G失一兩個(gè)數(shù)據(jù)包,也不會(huì)對(duì)接收結(jié)果產(chǎn)生太大影響。

UDP 通信示意圖如下:

qt udp,QT,udp,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)

UDP 消息傳送有三種模式,分別是單播廣播組播三種模式。

①單播(unicast): 單播用于兩個(gè)主機(jī)之間的端對(duì)端通信,需要知道對(duì)方的 IP 地址與端口

②廣播(broadcast): 廣播 UDP 與單播 UDP 的區(qū)別就是 IP 地址不同,廣播一般使用廣播地址
255.255.255.255,將消息發(fā)送到在同一廣播(也就是局域網(wǎng)內(nèi)同一網(wǎng)段) 網(wǎng)絡(luò)上的每個(gè)主機(jī)

注意:本地廣播信息是不會(huì)被路由器轉(zhuǎn)發(fā),所以如果一個(gè)服務(wù)端在win,另外一個(gè)客戶端在虛擬機(jī)說(shuō),這時(shí)就需要配置虛擬機(jī)的端口轉(zhuǎn)發(fā),這樣虛擬機(jī)才會(huì)連得上服務(wù)器。

qt udp,QT,udp,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)

③組播(multicast): 組播(多點(diǎn)廣播),也稱為多播,將網(wǎng)絡(luò)中同一業(yè)務(wù)類型主機(jī)進(jìn)行了邏輯上的分組,進(jìn)行數(shù)據(jù)收發(fā)的時(shí)候其數(shù)據(jù)僅僅在同一分組中進(jìn)行,其他的主機(jī)沒(méi)有加入此分組不能收發(fā)對(duì)應(yīng)的數(shù)據(jù)。

在廣域網(wǎng)上廣播的時(shí)候,其中的交換機(jī)和路由器只向需要獲取數(shù)據(jù)的主機(jī)復(fù)制并轉(zhuǎn)發(fā)數(shù)據(jù)。主機(jī)可以向路由器請(qǐng)求加入或退出某個(gè)組,網(wǎng)絡(luò)中的路由器和交換機(jī)有選擇地復(fù)制并傳輸數(shù)據(jù),將數(shù)據(jù)僅僅傳輸給組內(nèi)的主機(jī)。多播的這種功能,可以一次將數(shù)據(jù)發(fā)送到多個(gè)主機(jī),又能保證不影響其他不需要(未加入組)的主機(jī)的其他通信。

注意: 單播一樣和多播是允許在廣域網(wǎng)即 Internet 上進(jìn)行傳輸?shù)?,而廣播僅僅在同一局域網(wǎng)上才能進(jìn)行

二、QUdpSocket類

QT 的 socket 類之間的關(guān)系:?

qt udp,QT,udp,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)

QUdpSocket 類提供了一個(gè) UDP 套接字。 QUdpSocket 是 QAbstractSocket 的子類,允許發(fā)
送和接收 UDP 數(shù)據(jù)報(bào)。

常用API函數(shù)

①構(gòu)造函數(shù)

QUdpSocket::QUdpSocket(QObject *parent = Q_NULLPTR)

②如果至少有一個(gè)數(shù)據(jù)報(bào)在等待被讀取,則返回true,否則返回false。

bool QUdpSocket::hasPendingDatagrams() const?

③服務(wù)器綁定端口

bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform);

④返回第一個(gè)待處理的UDP數(shù)據(jù)報(bào)的大小Byte。如果沒(méi)有可用的數(shù)據(jù)報(bào),該函數(shù)返回-1。

qint64 QUdpSocket::pendingDatagramSize() const

⑤接收數(shù)據(jù)

qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)

接收一個(gè)不大于maxSize字節(jié)的數(shù)據(jù)報(bào)并將其存儲(chǔ)在data中。發(fā)送者的主機(jī)地址和端口存儲(chǔ)在*address和*port中(除非指針為0)。成功時(shí)返回?cái)?shù)據(jù)報(bào)的大?。环駝t返回-1。

如果maxSize太小,數(shù)據(jù)報(bào)的其余部分將被丟失。為了避免數(shù)據(jù)丟失,在試圖讀取數(shù)據(jù)報(bào)之前,應(yīng)調(diào)用pendingDatagramSize()來(lái)確定未決數(shù)據(jù)報(bào)的大小。如果maxSize為0,數(shù)據(jù)報(bào)將被丟棄。
?

⑥發(fā)送數(shù)據(jù)

qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

將數(shù)據(jù)報(bào)以大小的方式發(fā)送到端口端口的主機(jī)地址。成功時(shí)返回發(fā)送的字節(jié)數(shù),否則返回-1。
數(shù)據(jù)報(bào)總是被寫(xiě)成一個(gè)塊。數(shù)據(jù)報(bào)的最大尺寸與平臺(tái)高度相關(guān),但可以低至8192字節(jié)。如果數(shù)據(jù)報(bào)太大,這個(gè)函數(shù)將返回-1,error()將返回DatagramTooLargeError。

一般來(lái)說(shuō),發(fā)送大于512字節(jié)的數(shù)據(jù)報(bào)是不利的,因?yàn)榧词顾鼈儽怀晒Πl(fā)送,在到達(dá)最終目的地之前,它們很可能被IP層分割開(kāi)來(lái)。

?三、UDP服務(wù)器

?1.創(chuàng)建QUdpSocket對(duì)象

mSocket = new QUdpSocket(this);

②綁定地址和端口號(hào)

msocket->bind(ip,端口號(hào));

③收到數(shù)據(jù)時(shí),會(huì)觸發(fā)readyRead()信號(hào),自定義readPendingDatagrams()進(jìn)行讀取數(shù)據(jù);

connect(msocket,&QUdpSocket::readyRead,?this,&Widget::readPendingDatagrams);

④在while循環(huán)中讀取數(shù)據(jù),只要有數(shù)據(jù),就一直讀取并處理。

? void Server::readPendingDatagrams()
? {
? ? ? while (udpSocket->hasPendingDatagrams()) //數(shù)據(jù)報(bào)等待被讀取

???????{
? ? ? ? ?????????//數(shù)據(jù)緩沖區(qū)

????????????????QByteArray arr;

????????????????//調(diào)整緩沖區(qū)的大小和收到的數(shù)據(jù)大小一致 ????????????????

????????????????arr.resize(mSocket->bytesAvailable()); //接收數(shù)據(jù)

????????????????mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);

? ? ? ? ? ? ? ? //將arr.data轉(zhuǎn)為字符串即可

????????????????QString str = arr.data();

? ? ? }
? }

通信(先接收) 收到數(shù)據(jù)會(huì)觸發(fā)信號(hào)readyRead, 通過(guò)QUdpSocket對(duì)象的readDatagram函數(shù)來(lái)接收數(shù)據(jù) 。

readyRead()信號(hào)在數(shù)據(jù)報(bào)到達(dá)時(shí)發(fā)出。在這種情況下, hasPendingDatagrams()返回 true。調(diào)用 pendingDatagramSize()來(lái)獲取第一個(gè)待處理數(shù)據(jù)報(bào)的大小,并調(diào)用 readDatagram()接收數(shù)據(jù)。

注意:當(dāng)接收到readyRead()信號(hào)時(shí),一個(gè)傳入的數(shù)據(jù)報(bào)應(yīng)該被讀取,否則這個(gè)信號(hào)將不會(huì)被發(fā)送到下一個(gè)數(shù)據(jù)報(bào)。

⑤發(fā)送數(shù)據(jù)

qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

若是廣播消息,與單播消息不同的是將目標(biāo) IP 地址換成了廣播地址,一般廣播地址為 255.255.255.255,也可以使用QHostAddress::Broadcast獲取廣播地址

QHostAddress peerAddr = QHostAddress::Broadcast;

只需要將客戶端發(fā)送數(shù)據(jù):writeDatagramIP地址改為廣播地址即可。

四、UDP客戶端

①創(chuàng)建QUdpSocket對(duì)象

mSocket = new QUdpSocket(this);

②發(fā)送數(shù)據(jù)到指定的地址和端口號(hào)

writeDatagram(數(shù)據(jù),接收方ip,接收方端口號(hào));

?發(fā)送的數(shù)據(jù)要是QByteArray類型,Qt中將字符串轉(zhuǎn)為QByteArray可以使用.toUtf8函數(shù)。

五、代碼

1.udp服務(wù)端

?頭文件

#ifndef UDPSERVER_H
#define UDPSERVER_H

#include <QWidget>
#include <QtNetwork>

QT_BEGIN_NAMESPACE
namespace Ui { class UdpServer; }
QT_END_NAMESPACE

class UdpServer : public QWidget
{
    Q_OBJECT

public:
    UdpServer(QWidget *parent = nullptr);
    ~UdpServer();

private slots:
    void on_pushButton_start_clicked();

    void on_pushButton_send_clicked();
    void readPendingDatagrams();

private:
    Ui::UdpServer *ui;
    //Udp服務(wù)器
    QUdpSocket *mSocket;
    //通信的ip和端口,用于獲取發(fā)送者的 IP 和端口
    QHostAddress addr;
    quint16 port;
};
#endif // UDPSERVER_H

源文件

#include "udpserver.h"
#include "ui_udpserver.h"

UdpServer::UdpServer(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::UdpServer)
{
    ui->setupUi(this);
}

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

//啟動(dòng)
void UdpServer::on_pushButton_start_clicked()
{
    //1.創(chuàng)建QUdpSocket對(duì)象
    mSocket = new QUdpSocket(this);

    //2.連接接收數(shù)據(jù)信號(hào)和槽
    QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpServer::readPendingDatagrams);


    //3.綁定
    mSocket->bind(QHostAddress::Any,ui->spinBox->value());

    //連接回車(chē)發(fā)送的信號(hào)和槽
    QObject::connect(ui->lineEdit,&QLineEdit::returnPressed,this,&UdpServer::on_pushButton_send_clicked);

    //禁止端口號(hào)和啟動(dòng)按鈕
    ui->spinBox->setEnabled(false);
    ui->pushButton_start->setEnabled(false);
}

void UdpServer::on_pushButton_send_clicked()
{
    //獲取發(fā)送的數(shù)據(jù)
    QByteArray arr = ui->lineEdit->text().toUtf8();

    //發(fā)送
    mSocket->writeDatagram(arr,addr,port);
    //顯示發(fā)送的內(nèi)容
    ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
    //情況lineEdit
    ui->lineEdit->clear();
}

void UdpServer::readPendingDatagrams()
{
    //數(shù)據(jù)緩沖區(qū)
    QByteArray arr;
    while(mSocket->hasPendingDatagrams())
    {

        //調(diào)整緩沖區(qū)的大小和收到的數(shù)據(jù)大小一致
        arr.resize(mSocket->bytesAvailable());

        //接收數(shù)據(jù)
        mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
        //顯示
        ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");

        //使能發(fā)送按鈕和編輯框
        ui->lineEdit->setEnabled(true);
        ui->pushButton_send->setEnabled(true);
    }
}

2.udp客戶端

頭文件

#ifndef UDPCILENT_H
#define UDPCILENT_H

#include <QWidget>
#include <QtNetwork>

QT_BEGIN_NAMESPACE
namespace Ui { class UdpCilent; }
QT_END_NAMESPACE

class UdpCilent : public QWidget
{
    Q_OBJECT

public:
    UdpCilent(QWidget *parent = nullptr);
    ~UdpCilent();

private slots:
    void on_pushButton_send_clicked();
    void readPendingDatagrams();

private:
    Ui::UdpCilent *ui;
    //UDP客戶端
    QUdpSocket *mSocket;
};
#endif // UDPCILENT_H

?源文件

#include "udpcilent.h"
#include "ui_udpcilent.h"

UdpCilent::UdpCilent(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::UdpCilent)
{
    ui->setupUi(this);
    //1.創(chuàng)建QUdpSocket
    mSocket = new QUdpSocket(this);
    //2.通信(接收)
    QObject::connect(mSocket,&QUdpSocket::readyRead,this,&UdpCilent::readPendingDatagrams);

    //連接回車(chē)發(fā)送的信號(hào)和槽
    QObject::connect(ui->lineEdit_send,&QLineEdit::returnPressed,this,&UdpCilent::on_pushButton_send_clicked);

}

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

//發(fā)送
void UdpCilent::on_pushButton_send_clicked()
{
    //獲取發(fā)送的數(shù)據(jù)
    QByteArray arr = ui->lineEdit_send->text().toUtf8();

    //發(fā)送
    //mSocket->writeDatagram(arr,QHostAddress(ui->lineEdit_ip->text()),ui->spinBox->value());
    mSocket->writeDatagram(arr,QHostAddress::Broadcast,ui->spinBox->value());
    //顯示發(fā)送的內(nèi)容
    ui->textBrowser->insertPlainText("send:"+QString(arr)+"\n");
    //情況lineEdit
    ui->lineEdit_send->clear();
}

void UdpCilent::readPendingDatagrams()
{
    QHostAddress addr; //用于獲取發(fā)送者的 IP 和端口
    quint16 port;
    //數(shù)據(jù)緩沖區(qū)
    QByteArray arr;
    while(mSocket->hasPendingDatagrams())
    {
        //調(diào)整緩沖區(qū)的大小和收到的數(shù)據(jù)大小一致
        arr.resize(mSocket->bytesAvailable());

        //接收數(shù)據(jù)
        mSocket->readDatagram(arr.data(),arr.size(),&addr,&port);
        //顯示
        ui->textBrowser->insertPlainText(addr.toString()+":"+QString(arr)+"\n");
    }
}

結(jié)果:?
?qt udp,QT,udp,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-786018.html

到了這里,關(guān)于Qt之UDP通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt通信TCP/UDP

    qt socket通信,QTcpServer,QTcpSocket,QUdpSocket 鏈接2 鏈接3 鏈接4 QT中不再用套接字進(jìn)行通信,而是使用連接對(duì)

    2024年02月09日
    瀏覽(19)
  • Qt —UDP通信QUdpSocket 簡(jiǎn)介 +案例

    Qt —UDP通信QUdpSocket 簡(jiǎn)介 +案例

    ? ?UDP是無(wú)連接、不可靠、面向數(shù)據(jù)報(bào)(datagram)的協(xié)議,可以應(yīng)用于對(duì)可靠性要求不高的場(chǎng)合。與 TCP通信 不同,UDP通信無(wú)需預(yù)先建立持久的socket連接,UDP每次發(fā)送數(shù)據(jù)報(bào)都需要指定目標(biāo)地址和端口。 ? ?QUdpSocket以數(shù)據(jù)報(bào)傳輸數(shù)據(jù),而不是以連續(xù)的數(shù)據(jù)流。發(fā)送數(shù)據(jù)報(bào)使用函

    2024年02月10日
    瀏覽(18)
  • Qt 8. UDP客戶端通信

    Qt 8. UDP客戶端通信

    1. 代碼 2. 效果 以上代碼可以實(shí)現(xiàn)UDP收發(fā)功能。

    2024年02月13日
    瀏覽(22)
  • Qt - UDP網(wǎng)絡(luò)編程

    Qt - UDP網(wǎng)絡(luò)編程

    UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議) UDP是一個(gè)輕量級(jí)、不可靠、面向數(shù)據(jù)報(bào)的、無(wú)連接的協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸。 QUdpSocket類繼承自QAbstractSocket,用來(lái)發(fā)送和接收UDP數(shù)據(jù)報(bào),”Socket”即套接字,套接字即IP地址+端口號(hào)。其中IP地址指定了網(wǎng)絡(luò)

    2024年04月22日
    瀏覽(22)
  • 14-3_Qt 5.9 C++開(kāi)發(fā)指南_QUdpSocket實(shí)現(xiàn) UDP 通信_(tái)UDP 單播和廣播

    14-3_Qt 5.9 C++開(kāi)發(fā)指南_QUdpSocket實(shí)現(xiàn) UDP 通信_(tái)UDP 單播和廣播

    UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是輕量的、不可靠的、面向 數(shù)據(jù)報(bào) (datagram) 、無(wú)連接的協(xié)議,它可以用于對(duì)可靠性要求不高的場(chǎng)合。與 TCP 通信不同, 兩個(gè)程序之間進(jìn)行 UDP 通信無(wú)需預(yù)先建立持久的 socket 連接,UDP 每次發(fā)送數(shù)據(jù)報(bào)都需要指定目標(biāo)地址和端口 (如圖14-6

    2024年02月14日
    瀏覽(26)
  • Qt網(wǎng)絡(luò)編程 (udp廣播和接收例)

    Qt網(wǎng)絡(luò)編程 (udp廣播和接收例)

    使用兩個(gè)項(xiàng)目 1 sender 用來(lái)廣播\\\"hello world\\\"; 2 receiver 用來(lái)接收廣播信息 1 創(chuàng)建Qdialog類 2 在sender.pro 中添加 QT +=network 一行代碼 3 在sender.h 中聲明類 class QUdpSocket; 在聲明一個(gè)私有對(duì)象 QUdpSocket *sender; 4 在ui界面拖入一個(gè)按鈕 用來(lái)觸發(fā)廣播信息 其槽函數(shù)如下 在sender.cpp 構(gòu)造函數(shù)中添

    2024年02月11日
    瀏覽(19)
  • [Qt網(wǎng)絡(luò)編程]之UDP通訊的簡(jiǎn)單編程實(shí)現(xiàn)

    [Qt網(wǎng)絡(luò)編程]之UDP通訊的簡(jiǎn)單編程實(shí)現(xiàn)

    hello!歡迎大家來(lái)到我的Qt學(xué)習(xí)系列之 網(wǎng)絡(luò)編程之UDP通訊的簡(jiǎn)單編程實(shí)現(xiàn)。 希望這篇文章能對(duì)你有所幫助?。?! 本篇文章的相關(guān)知識(shí)請(qǐng)看我的上篇文章: 目錄 UDP通訊 ?基于主窗口的實(shí)現(xiàn) ?基于線程的實(shí)現(xiàn) ???????? UDP數(shù)據(jù)報(bào)協(xié)議是一個(gè)面向無(wú)連接的傳輸層報(bào)文協(xié)議 ,它簡(jiǎn)

    2024年04月25日
    瀏覽(29)
  • QT網(wǎng)絡(luò)編程之實(shí)現(xiàn)UDP廣播發(fā)送和接收

    一.UDP廣播介紹 UDP廣播地址固定IP地址為:XXX.XXX.XXX.255。 如果向全網(wǎng)段發(fā)送廣播消息,那么廣播地址為:255.255.255.255; 如果向單個(gè)網(wǎng)段發(fā)送廣播消息,例如你的IP是192.168.31.104,那么廣播地址為192.168.31.255。 廣播消息接收方需要綁定0.0.0.0地址并監(jiān)聽(tīng)指定端口即可收到廣播的群

    2024年03月25日
    瀏覽(50)
  • QT網(wǎng)絡(luò)編程TCP/UDP開(kāi)發(fā)流程 制作網(wǎng)絡(luò)調(diào)試助手

    QT網(wǎng)絡(luò)編程TCP/UDP開(kāi)發(fā)流程 制作網(wǎng)絡(luò)調(diào)試助手

    1、QT的網(wǎng)絡(luò)編程: TCP和UDP TCP編程需要用到倆個(gè)類: QTcpServer 和 QTcpSocket QTcpSocket類 提供了一個(gè)TCP套接字 QTcpSocket是QAbstractSocket的一個(gè)子類,它允許您建立TCP連接和傳輸數(shù)據(jù)流 注意:TCP套接字不能在QIODevice::Unbuffered模式下打開(kāi)。 QTcpServer類 提供一個(gè)基于tcp的服務(wù)器 2. 這個(gè)類可以接

    2023年04月08日
    瀏覽(15)
  • 【Qt網(wǎng)絡(luò)編程】實(shí)現(xiàn)TCP協(xié)議通信

    【Qt網(wǎng)絡(luò)編程】實(shí)現(xiàn)TCP協(xié)議通信

    傳輸控制協(xié)議(TCP,Transmission Control Protocol)是 一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議 ,由IETF的RFC 793 定義。 TCP建立連接前,需要進(jìn)行三次握手,如下圖所示: TCP斷開(kāi)連接前,需要進(jìn)行四次揮手,如下圖所示: Qt中提供了QTcpSocket類和QTcpServer類分別用于創(chuàng)

    2024年02月16日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包