Qt5 UDP開發

最近在學習qt下socket開發,今天先學習了一下qt下udp socket的開發。參考了qt5的文檔。以及一些其他的參考書。

UDP是指user datagram protocol ,用戶數據報協議,是一種輕量級,不可靠的,面向數據報的,非鏈接的協議。常用在一下對數據可靠性要求不是很重要的程序中。

這個類最常用的方式就是利用bind()函數綁定到某一地址和端口,然後調用 writeDategram()函數和
readDatagram()函數進行數據傳輸。

如果你想要使用標準的QIODevice函數例如read(),readLine(),write()等,你必須首先利用connectToHost()函數把socket直接連接到通信的另一端。

socket每向網絡寫入一個數據報就會發射bytesWritten()信號。如果你只是想發送一份數據報,你並不需要調用bind()函數進行綁定。

無論何時有數據報到達時 socket就會發射readyRead()信號。這樣的話,hasPendingDatagram()函數會返回true值。然後調用 pendingDatagramSize()函數來獲得到達的第一份數據報的字節大小,最後調用readDatagram()函數來讀取到達的數據報。

最後要注意的一點是:當收到readyRead()信號時,已到達的數據報都應該被讀取,否則,當下一次有數據報到達的時候,readyRead()信號就不會發射了。

下面是QT參考文檔上的一個例子:

void server::initSocket()
{
udpSocket = new QUdpSocket(this);//構建一個udpsocket;
udpSocket->bind(QHostAddress::LocalHost,7755);//綁定到本機地址的7755端口


//連接readyRead()信號與槽readPendingDatagram()來讀取數據報
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readPendingDatagram()));
}

void server::readPendingDatagram()  //讀取數據的槽實現
{
while(udpSocket->hasPendingDatagram())//只要socket有數據到達,一直循環的讀取
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());//調整datagram的大小與socket收到的數據大小一樣

QHostAddress sender;//發送者的地址
qint64 senderPort;//發送者的端口號
udpSocket->readDatagram(datagram.data(),datagram.size(),&sender,&senderPort);//讀取數據報

processTheDatagram(datagram);//處理讀取到的數據報
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章