博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn
如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱
版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QUdpSocket-Qt使用Udp通訊實現服務端和客戶端 本文地址: https://www.techieliang.com/2017/12/532/
1. QNetworkDatagram
qt網絡報文,可用其建立一個通訊內容包括目標ip、端口號、數據內容。同時接收到的信息也未此類型,可以訪問接收數據的長度、發送者的ip及端口等信息
詳情請見幫助
QUdpSocket
有Qt提供的udp通訊的類,詳細介紹請見官方文檔
2. 客戶端
注意pro文件要包含QT += network
- #include <QHostAddress>
- #include <QUdpSocket>
- QUdpSocket *m_socket=new QUdpSocket;
- m_socket.writeDatagram(msg, QHostAddress::localhost, 8000);
qudpsocket對於發送數據報文提供了三個重載函數:
- qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
- qint64 writeDatagram(const QNetworkDatagram &datagram)
- qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
上面的范例使用的是第三種類型,也可以自行建立QNetworkDatagram對象,修改好內容后直接調用writeDatagram
3. 服務端
服務端與客戶端類似,需要先綁定端口“bind”,此函數在QAbstractSocket類中提供
- bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)
- bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
具體使用方式:
- m_socket = new QUdpSocket;
- m_socket->bind(QHostAddress::localhost, 8000);
- connect(m_socket, SIGNAL(readyRead()), this, SLOT(receive()));
綁定端口以后,需要將此socket的readyread信號與自定義槽函數連接,當服務端收到消息時會觸發此信號。
4. 消息收發
由於udp與tcp不同,不需要三次握手建立連接,所以並不會在連接之后記錄當前socket。
發送消息在客戶端中已經提供示例
接收消息需要使用Qudpsocket提供以下函數:
- qint64 pendingDatagramSize() const
- qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
- QNetworkDatagram receiveDatagram(qint64 maxSize = -1)
當readyRead信號觸發時,可直接通過receiveDatagram函數獲取消息報文對象,其內存儲消息的發送ip、端口、消息內容等所有信息。
也可以通過pendingDatagramSize判斷消息長度,然后通過readDatagram獲取消息內容。
在readyRead槽函數中可以先調用QUdpSocket::hasPendingDatagrams判斷當前是否有需要讀取的消息,若有消息再進行pendingDatagramSize獲取需要讀取的大小
