Qt中使用QUdpSocket實現UDP通信方法

1. 簡介

UDP(User Datagram Protocol,用戶數據報協議)是輕量的、不可靠的、面向數據報(datagram)、無連接的協議,可以用於對可靠性要求不高的場所。
在使用Qt開發上位機或者應用程序中,需要使用到UDP通信,需要預先建立持久的socket鏈接,UDP每次發送數據報都需要指定目標IP地址和端口。

2. QUdpSocket類所用到的接口函數:

函數 功能
bool bind (quint16 port) 爲UDP通信綁定一個端口
bool abort ( ) 釋放爲UDP綁定的端口
qint64 writeDatagram(QByteArray &datagram, QHostAddress &host, quint16 port) 數據報發送,形參分別爲數據報,目的IP地址,目的端口號
bool hasPendingDatagram() 接收到數據報時,返回值爲true
qint64 pendingDatagramSize() 返回待讀取數據報的大小
qint64 readDatagram(char *data, qint64 maxSize) 讀取數據報,返回讀取數據報的字節數,maxSize爲設置的讀取字節數,還可以加上源IP和源端口號

3.收發流程

3.1 UDP發送

QUdpSocket  *udpSocket;
//端口綁定與解綁操作
quint16 port=8080;
udpSocket->bind(port);//綁定到port端口
udpSocket->abort();//用於解綁端口
//發送數據報操作
QByteArray datagram;
datagram.append(0xAA);//數據報填充字節數據

QHostAddress RemoteIP(“192.168.0.1”);//添加遠端IP
quint16 RemotePort(port);//添加遠端端口號

udpSocket->writeDatagram(datagram,RemoteIP,RemotePort);

3.2 UDP接收

//信號槽設置
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(UDPReceive()));//添加信號與槽的連接,當主機端口接收到數據時readyRead()有效,進而觸發跳轉到UDPReceive()函數;其中readyRead()爲Qt中QIODEVICE類中函數,UDPReceive()是需要自己編寫的函數。
//字節讀取
while(udpSocket->hasPendingDatagrams()){//判斷有數據報接收到
	 QByteArray datagram;
     datagram.resize(udpSocket->pendingDatagramSize());//設置字節數組大小
     QHostAddress remoteIP;//接收遠端IP
     quint16 remotePort;//接收遠端端口號
     udpSocket->readDatagram(datagram.data(),datagram.size(),&remoteIP,&remotePort);//讀取數據
    QString str=datagram.data();//將讀取的數據轉化爲字符串
}

參考文獻

《Qt 5.9 C++開發指南》王維波著,P400

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章