首页 > 代码库 > QT的UDP组播技术
QT的UDP组播技术
一 UDP介绍
UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输。适合下面4种情况:
网络数据大多为短消息。
拥有大量客户端。
对数据安全性无特殊要求
网络负担非常重,但对响应速度要求高。
二 基于udp协议的c/s编程模型(广播),组播的话,明天再看。
客户端:
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.
具体实现:
#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_OBJECTpublic: 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()将报文读取到缓冲区中。
QT的UDP组播技术
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。