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

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

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

概要:本期主要講解QT中對(duì)UDP協(xié)議通信的實(shí)現(xiàn)。

一、UDP協(xié)議通信

Internet 協(xié)議集支持一個(gè)無(wú)連接的傳輸協(xié)議,該協(xié)議稱(chēng)為用戶數(shù)據(jù)報(bào)協(xié)議(UDP,User Datagram Protocol)。UDP 為應(yīng)用程序提供了一種無(wú)需建立連接就可以發(fā)送封裝的 IP 數(shù)據(jù)包的方法。RFC 768 描述了 UDP。
【QT網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP協(xié)議通信
UDP協(xié)議根據(jù)消息傳送模式可以分為:單播(Unicast)、組播(Multicast)和廣播(Broadcast)。

  1. 單播:一個(gè)UDP客戶端發(fā)出的數(shù)據(jù)報(bào)只發(fā)送到另一個(gè)指定地址和端口的UDP客戶端,是一對(duì)一的數(shù)據(jù)傳輸。
  2. 組播:也稱(chēng)多播,UDP客戶端加入到另一個(gè)組播IP地址指定的多播組,成員向組播地址發(fā)送的數(shù)據(jù)報(bào)組內(nèi)成員都可以接收到,類(lèi)似于QQ群功能。
  3. 廣播:一個(gè)UDP客戶端發(fā)出的數(shù)據(jù)報(bào),在同一網(wǎng)絡(luò)范圍內(nèi)其他所有的UDP客戶端都可以收到。

二、Qt中UDP協(xié)議的處理

Qt中提供了QUdpSocket類(lèi)用于創(chuàng)建UDP套接字。

1.QUdpSocket

QUdpSocket類(lèi)繼承于QAbstractSocket,提供了UdpSocket套接字的創(chuàng)建、連接對(duì)位服務(wù)器、加組等。
【QT網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP協(xié)議通信

三、Qt實(shí)現(xiàn)UDP通信

UDP通信是對(duì)等服務(wù)器間信息傳遞,其實(shí)不需要指定客戶端和服務(wù)器端,但是為了便于理解,我在實(shí)現(xiàn)時(shí)仍然采用C-S的結(jié)構(gòu)。
實(shí)現(xiàn)步驟如下:
創(chuàng)建UDP套接字 --> 綁定端口 --> 加組(區(qū)分消息傳送模式) -->發(fā)送數(shù)據(jù)(區(qū)分消息傳送模式) --> 接受數(shù)據(jù)

1.客戶端

客戶端實(shí)現(xiàn)發(fā)送數(shù)據(jù)。

#ifndef UDPCLIENT_H
#define UDPCLIENT_H

#include <QObject>
#include <QHostAddress>
#include <QUdpSocket>
#include <QDebug>
#include <QTimer>

class UDPClient :QObject
{
    Q_OBJECT
public:
    UDPClient();

    void InitSocket();//初始化UDP套接字

    void InitTimer();//初始化定時(shí)器

public slots:
    void SendData();//發(fā)送數(shù)據(jù)

private:
    QUdpSocket *mUdpSocket;//UDP套接字對(duì)象
    QHostAddress mGroupAddress;//組播地址
    QTimer *mTimer;//定時(shí)器對(duì)象
    int mType;//記錄UDP消息傳送模式 0:單播 1:廣播 2:組播(多播)
};

#endif // UDPCLIENT_H
#include "udpclient.h"

UDPClient::UDPClient()
{
//    mType = 0;//Unicast
//    mType = 1;//Broadcast
    mType = 2;//Multicast
    InitSocket();
    InitTimer();

}

void UDPClient::InitSocket()
{
    mUdpSocket = new QUdpSocket;//初始化socket
    mGroupAddress.setAddress("239.2.2.222");//設(shè)置組播地址
    mUdpSocket->bind(6666);//綁定端口號(hào)
    if(mType == 2)
    {
        //組播的數(shù)據(jù)的生存期,數(shù)據(jù)報(bào)沒(méi)跨1個(gè)路由就會(huì)減1.表示多播數(shù)據(jù)報(bào)只能在同一路由下的局域網(wǎng)內(nèi)傳播
        mUdpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);
    }
}

void UDPClient::InitTimer()
{
    mTimer = new QTimer;//初始化定時(shí)器
    connect(mTimer,&QTimer::timeout,this,[=]
    {
        SendData();
    });
    mTimer->start(1000);//每隔一秒發(fā)送一次數(shù)據(jù)
}

void UDPClient::SendData()
{
    QByteArray _data = "hello";
    if(mType == 0)//單播
    {
        QHostAddress _peerHostAddress = QHostAddress("10.0.0.177");//對(duì)位服務(wù)器IP
        quint16 _port = 6666;//對(duì)位服務(wù)器端口
        if(-1 !=mUdpSocket->writeDatagram(_data.data(),_data.size(),_peerHostAddress,_port))
        {
            qDebug()<< "Unicast ==> Send data : "<< _data<<endl;
        }
        mUdpSocket->flush();
    }
    else if(mType == 1)//廣播
    {
        quint16 _port = 6666;//廣播端口
        if(-1 !=mUdpSocket->writeDatagram(_data.data(),QHostAddress::Broadcast,_port))
        {
            qDebug()<< "Broadcast ==> Send data : "<< _data<<endl;
        }
        mUdpSocket->flush();
    }
    else if(mType == 2)//組播
    {
        quint16 _port = 8888;//組播端口
        if(-1 != mUdpSocket->writeDatagram(_data.data(),mGroupAddress,_port))
        {
            qDebug()<< "Multicast ==> Send data : "<< _data<<endl;
        }
        mUdpSocket->flush();
    }
    else
    {
        qDebug()<< "mType is error! "<<endl;
        return;
    }


}

2.服務(wù)器端

服務(wù)器端實(shí)現(xiàn)數(shù)據(jù)的接收。

#ifndef UDPSERVER_H
#define UDPSERVER_H

#include <QObject>
#include <QHostAddress>
#include <QUdpSocket>
#include <QDebug>

class UDPServer : QObject
{
    Q_OBJECT
public:
    UDPServer();
    void InitSocket();//初始化套接字

public slots:
    void ReadPendingDataframs();//讀取消息

private:
    QUdpSocket *mUdpSocket;//UDP套接字
    QHostAddress mGroupAdress;//組播地址
    int mType; //記錄UDP消息傳送模式 0:單播 1:廣播  2:組播(多播)
};

#endif // UDPSERVER_H
#include "udpserver.h"
UDPServer::UDPServer()
{
//    mType = 0;//Unicast
//    mType = 1;//Broadcast
    mType = 2;//Multicast
    InitSocket();

}

void UDPServer::InitSocket()
{
    //初始化socket,設(shè)置組播地址
    mUdpSocket = new QUdpSocket;
    mGroupAdress.setAddress("239.2.2.222");
    if(mType == 0 || mType == 1)
    {
        //綁定本地IP和端口號(hào)
        mUdpSocket->bind(6666);
    }
    else if(mType == 2)
    {
        if(mUdpSocket->bind(QHostAddress::AnyIPv4,8888,QUdpSocket::ShareAddress))
        {
            //加入組播地址
            mUdpSocket->joinMulticastGroup(mGroupAdress);
            qDebug()<<("Join Multicast Adrress [")<<mGroupAdress.toString()
                   <<("] Successful!")<<endl;
        }
    }
    else
    {
        qDebug()<< "mType is error! "<<endl;
        return;
    }

    connect(mUdpSocket,&QUdpSocket::readyRead,this,[=]{
        ReadPendingDataframs();
    });
}



void UDPServer::ReadPendingDataframs()
{
    QByteArray _data;
    _data.resize(mUdpSocket->pendingDatagramSize());
    if(mType == 0)//Unicast
    {
        QHostAddress *_peerHostAddress = new QHostAddress("10.0.0.32");
        quint16 _port = 6666;
        while(mUdpSocket->hasPendingDatagrams())
        {
            mUdpSocket->readDatagram(_data.data(),_data.size(),_peerHostAddress,&_port);//接收指定IP和端口的udp報(bào)文
            qDebug()<<"Unicast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;
        }
    }
    else if(mType == 1)//Broadcast
    {
        QHostAddress _peerHostAddress;
        quint16 _port;
        while(mUdpSocket->hasPendingDatagrams())
        {
            mUdpSocket->readDatagram(_data.data(),_data.size(),&_peerHostAddress,&_port);//接收同一子網(wǎng)的udp報(bào)文
            qDebug()<<"Broadcast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;
        }
    }
    else if(mType == 2)//Multicast
    {
        QHostAddress _peerHostAddress;
        quint16 _port;
        while(mUdpSocket->hasPendingDatagrams())
        {
            mUdpSocket->readDatagram(_data.data(),_data.size(),&_peerHostAddress,&_port);//接收同組的udp報(bào)文
            qDebug()<<"Multicast ==> Receive data : "<<QString::fromLatin1(_data)<<endl;
        }
    }
    else
    {
        qDebug()<< "mType is error! "<<endl;
        return;
    }
}

結(jié)尾

以上就是QT實(shí)現(xiàn)UDP協(xié)議通信的全部?jī)?nèi)容了,記得加上network模塊:)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433502.html

到了這里,關(guān)于【QT網(wǎng)絡(luò)編程】實(shí)現(xiàn)UDP協(xié)議通信的文章就介紹完了。如果您還想了解更多內(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網(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)
  • 【網(wǎng)絡(luò)編程】利用套接字實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)通信(UDP實(shí)現(xiàn)聊天室 附上源碼)

    【網(wǎng)絡(luò)編程】利用套接字實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)通信(UDP實(shí)現(xiàn)聊天室 附上源碼)

    源IP地址(Source IP Address): 源IP地址是數(shù)據(jù)包發(fā)送方(或數(shù)據(jù)流出發(fā)點(diǎn))的唯一標(biāo)識(shí)符。它用于在互聯(lián)網(wǎng)或本地網(wǎng)絡(luò)中定位發(fā)送數(shù)據(jù)包的設(shè)備或主機(jī)。源IP地址是數(shù)據(jù)包的出發(fā)點(diǎn),即數(shù)據(jù)從這個(gè)地址開(kāi)始傳送,向目的IP地址指示的設(shè)備發(fā)送。 在TCP/IP協(xié)議中,源IP地址通常由發(fā)

    2024年02月14日
    瀏覽(26)
  • 【Java】網(wǎng)絡(luò)編程與Socket套接字、UDP編程和TCP編程實(shí)現(xiàn)客戶端和服務(wù)端通信

    【Java】網(wǎng)絡(luò)編程與Socket套接字、UDP編程和TCP編程實(shí)現(xiàn)客戶端和服務(wù)端通信

    為什么需要網(wǎng)絡(luò)編程? 現(xiàn)在網(wǎng)絡(luò)普及程序越來(lái)越高,網(wǎng)絡(luò)上保存著我們?nèi)粘I钪行枰母鞣N資源,使用程序通過(guò)網(wǎng)絡(luò)來(lái)獲取這些資源的過(guò)程就需要網(wǎng)絡(luò)編程來(lái)實(shí)現(xiàn)。 什么是網(wǎng)絡(luò)編程? 網(wǎng)絡(luò)編程,指網(wǎng)絡(luò)上的主機(jī),通過(guò)不同的進(jìn)程以程序的方式實(shí)現(xiàn)網(wǎng)絡(luò)通信(網(wǎng)絡(luò)數(shù)據(jù)傳輸)

    2024年02月17日
    瀏覽(91)
  • 【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶端、服務(wù)器通信

    【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶端、服務(wù)器通信

    ? 哈嘍,大家好~我是你們的老朋友: 保護(hù)小周??? 本期為大家?guī)?lái)的是網(wǎng)絡(luò)編程的 UDP Socket 套接字,基于 UDP協(xié)議的 Socket 實(shí)現(xiàn)客戶端服務(wù)器通信 ,Socket 套接字可以理解為是,傳輸層給應(yīng)用層提供的一組 API,如此程序,確定不來(lái)看看嘛~~ 本期收錄于博主的專(zhuān)欄 : JavaEE_保

    2024年02月02日
    瀏覽(111)
  • [C++ 網(wǎng)絡(luò)協(xié)議編程] UDP協(xié)議

    [C++ 網(wǎng)絡(luò)協(xié)議編程] UDP協(xié)議

    目錄 1. UDP和TCP的區(qū)別 2. UDP的工作原理 3. UDP存在數(shù)據(jù)邊界 4. UDP的I/O函數(shù) 4.1 sendto函數(shù) 4.2 recvfrom函數(shù) 4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服務(wù)器端通信流程 5.2 客戶端通信流程 主要區(qū)別: TCP和UDP的主要區(qū)別是,TCP具有流控制機(jī)制,而UDP沒(méi)

    2024年02月12日
    瀏覽(32)
  • 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類(lèi)繼承自QAbstractSocket,用來(lái)發(fā)送和接收UDP數(shù)據(jù)報(bào),”Socket”即套接字,套接字即IP地址+端口號(hào)。其中IP地址指定了網(wǎng)絡(luò)

    2024年04月22日
    瀏覽(22)
  • Linux網(wǎng)絡(luò)編程(四)——UDP通信

    Linux網(wǎng)絡(luò)編程(四)——UDP通信

    目錄 0x01 UDP協(xié)議 一、UDP通信簡(jiǎn)介以及接口 二、UDP的接口 三、UDP收發(fā)例程 0x02 廣播 一、設(shè)置廣播數(shù)據(jù)函數(shù)接口 二、廣播代碼實(shí)現(xiàn) 0x03 組播(多播) 一、組播地址 二、設(shè)置組播函數(shù)接口 三、代碼實(shí)現(xiàn) UDP是一個(gè)面向無(wú)連接的,不可靠的服務(wù),功能即為在IP的數(shù)據(jù)報(bào)服務(wù)之上增

    2024年02月12日
    瀏覽(20)
  • 網(wǎng)絡(luò)編程(TCP與UDP協(xié)議)

    網(wǎng)絡(luò)編程(TCP與UDP協(xié)議)

    Java是 Internet 上的語(yǔ)言,它從語(yǔ)言級(jí)上提供了對(duì)網(wǎng)絡(luò)應(yīng)用程序的支持,程序員能夠很容易開(kāi)發(fā)常見(jiàn)的網(wǎng)絡(luò)應(yīng)用程序。 Java提供的網(wǎng)絡(luò)類(lèi)庫(kù),可以實(shí)現(xiàn)無(wú)痛的網(wǎng)絡(luò)連接,聯(lián)網(wǎng)的底層細(xì)節(jié)被隱藏在 Java 的本機(jī)安裝系統(tǒng)里,由 JVM 進(jìn)行控制。并且 Java 實(shí)現(xiàn)了一個(gè)跨平臺(tái)的網(wǎng)絡(luò)庫(kù), 程序

    2023年04月27日
    瀏覽(32)
  • Python網(wǎng)絡(luò)編程之UDP協(xié)議

    Python網(wǎng)絡(luò)編程之UDP協(xié)議

    Hello,大家好。本期來(lái)和大家一起學(xué)習(xí)一下網(wǎng)絡(luò)編程UDP的相關(guān)知識(shí)。 ip ip地址:用來(lái)在網(wǎng)絡(luò)中標(biāo)記一臺(tái)電腦,在本地局域網(wǎng)上是唯一的。 查看電腦ip地址:ipconfig(win)/ifconfig(linux/mac) 端口 端口:設(shè)備與外界通訊交流的出口 一共有65536個(gè)(0 - 65535) 端口 知名端口是眾所周知的

    2024年02月03日
    瀏覽(30)
  • 【網(wǎng)絡(luò)編程】TCP,UDP協(xié)議詳解

    【網(wǎng)絡(luò)編程】TCP,UDP協(xié)議詳解

    小亭子正在努力的學(xué)習(xí)編程,接下來(lái)將開(kāi)啟javaEE的學(xué)習(xí)~~ 分享的文章都是學(xué)習(xí)的筆記和感悟,如有不妥之處希望大佬們批評(píng)指正~~ 同時(shí)如果本文對(duì)你有幫助的話,煩請(qǐng)點(diǎn)贊關(guān)注支持一波, 感激不盡~~ ? 目錄 前言 TCP協(xié)議 TCP協(xié)議特點(diǎn) TCP協(xié)議通信場(chǎng)景 TCP協(xié)議的幾個(gè)重要機(jī)制 一、

    2023年04月19日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包