QT的UDP組播技術

一 UDP介紹編程

UDP是一種簡單輕量級的傳輸層協議,提供無鏈接的,不可靠的報文傳輸。適合下面4種狀況:安全

網絡數據大多爲短消息。網絡

擁有大量客戶端。socket

對數據安全性無特殊要求tcp

網絡負擔很是重,但對響應速度要求高。函數

二 基於udp協議的c/s編程模型(廣播),組播的話,明天再看。ui

客戶端:this

class Sender : public QObject
{
    Q_OBJECT //可使用信號和槽
public:
    explicit Sender(QObject *parent = 0);
    ~Sender();//虛構函數無返回值
    void start();
public slots:
    void broadcastDatagram();

private:
    QUdpSocket *udpSocket;//包含 <QtNetwork/qudpsocket.h>
    QTimer *timer;
    int messageNo;


};

在使用udp tcp時,qt的.pro文件中要加上 QT    +=network.spa

具體實現:code

#include "sender.h"

Sender::Sender(QObject *parent) :
    QObject(parent)
{
    timer = new QTimer(this);
    udpSocket = new QUdpSocket(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(broadcastDatagram()));
    messageNo = 1;
}
void Sender::start()
{
    timer->start(1000);
}
void Sender::broadcastDatagram()
{
    qDebug()<<(tr("Begin Broadcast: %1").arg(messageNo));
    QByteArray datagram = "BroadCast Message:" + QByteArray::number(messageNo);
    udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444);
    ++messageNo;
}

Sender::~Sender()
{
    delete timer;
    delete udpSocket;//是否刪除connect?
        
}

  udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444);
函數原型:writeDatagram(const char* data,qint64 size,const QHostAddress &address,quint16 port)
函數功能:將數據包發出
函數參數:數據包自身,數據包大小,發送到的地址,端口。

 

 

接收端:

class Receiver : public QObject
{
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = 0);
    ~Receiver();
signals:

public slots:
    void processPendingDatagrams();
private:
    QUdpSocket *udpSocket;

};

具體實現:

#include "receiver.h"

Receiver::Receiver(QObject *parent) :
    QObject(parent)
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(44444);
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
}
void Receiver::processPendingDatagrams()
{
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(),datagram.size());
        qDebug() << (tr("Receice Data: \"%1\"").arg(datagram.data()));
    }
}
Receiver::~Receiver()
{
    delete udpSocket;
}

當接受到數據包時,QUdpSocket會發出readyRead()信號。我關聯了processPendingDatagrams()。

先用hasPendingDatagrams()判斷是否有可供讀取的數據。如有,則用pendingDatagramSize()開闢一個緩衝區。

最後,用readDatagram()將報文讀取到緩衝區中。

相關文章
相關標籤/搜索