QUdpSocket-Qt使用Udp通信實現服務端和客戶端

版權聲明:若無來源註明, Techie亮博客文章均爲原創。 轉載請以連接形式標明本文標題和地址:
本文標題:QUdpSocket-Qt使用Udp通信實現服務端和客戶端     本文地址: https://www.techieliang.com/2017/12/532/

1. QNetworkDatagram

qt網絡報文,可用其創建一個通信內容包括目標ip、端口號、數據內容。同時接收到的信息也未此類型,能夠訪問接收數據的長度、發送者的ip及端口等信息html

詳情請見幫助網絡

QUdpSocket

有Qt提供的udp通信的類,詳細介紹請見官方文檔app

2. 客戶端

注意pro文件要包含QT += networksocket

  1. #include <QHostAddress>
  2. #include <QUdpSocket>
  3. QUdpSocket *m_socket=new QUdpSocket;
  4. m_socket.writeDatagram(msg, QHostAddress::localhost, 8000);

qudpsocket對於發送數據報文提供了三個重載函數:tcp

  1. qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
  2. qint64 writeDatagram(const QNetworkDatagram &datagram)
  3. qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

上面的範例使用的是第三種類型,也能夠自行創建QNetworkDatagram對象,修改好內容後直接調用writeDatagram函數

3. 服務端

服務端與客戶端相似,須要先綁定端口「bind」,此函數在QAbstractSocket類中提供post

  1. bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)
  2. bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)

具體使用方式:ui

  1. m_socket = new QUdpSocket;
  2. m_socket->bind(QHostAddress::localhost, 8000);
  3. connect(m_socket, SIGNAL(readyRead()), this, SLOT(receive()));

綁定端口之後,須要將此socket的readyread信號與自定義槽函數鏈接,當服務端收到消息時會觸發此信號。this

4. 消息收發

因爲udp與tcp不一樣,不須要三次握手創建鏈接,因此並不會在鏈接以後記錄當前socket。spa

發送消息在客戶端中已經提供示例

接收消息須要使用Qudpsocket提供如下函數:

  1. qint64 pendingDatagramSize() const
  2. qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
  3. QNetworkDatagram receiveDatagram(qint64 maxSize = -1)

當readyRead信號觸發時,可直接經過receiveDatagram函數獲取消息報文對象,其內存儲消息的發送ip、端口、消息內容等全部信息。

也能夠經過pendingDatagramSize判斷消息長度,而後經過readDatagram獲取消息內容。

在readyRead槽函數中能夠先調用QUdpSocket::hasPendingDatagrams判斷當前是否有須要讀取的消息,如有消息再進行pendingDatagramSize獲取須要讀取的大小

轉載請以連接形式標明本文標題和地址: Techie亮博客 » QUdpSocket-Qt使用Udp通信實現服務端和客戶端
相關文章
相關標籤/搜索