QUdpSocket 類

The QUdpSocket 類提供 UDP (用戶數據報協議) 套接字。 更多...

頭: #include <QUdpSocket>
qmake: QT += network
繼承: QAbstractSocket

注意: 此類的所有函數 可重入 .

公共函數

QUdpSocket (QObject * parent = Q_NULLPTR)
virtual ~QUdpSocket ()
bool hasPendingDatagrams () const
bool joinMulticastGroup (const QHostAddress & groupAddress )
bool joinMulticastGroup (const QHostAddress & groupAddress , const QNetworkInterface & iface )
bool leaveMulticastGroup (const QHostAddress & groupAddress )
bool leaveMulticastGroup (const QHostAddress & groupAddress , const QNetworkInterface & iface )
QNetworkInterface multicastInterface () const
qint64 pendingDatagramSize () const
qint64 readDatagram (char * data , qint64 maxSize , QHostAddress * address = Q_NULLPTR, quint16 * port = Q_NULLPTR)
QNetworkDatagram receiveDatagram (qint64 maxSize = -1)
void setMulticastInterface (const QNetworkInterface & iface )
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 )

額外繼承成員

詳細描述

The QUdpSocket 類提供 UDP (用戶數據報協議) 套接字。

UDP (用戶數據報協議) 是輕量、不可靠、麵嚮數據報的無連接協議。可以使用它,當可靠性不重要時。 QUdpSocket 是子類化的 QAbstractSocket ,允許發送和接收 UDP 數據報。

此類的最常見用法是綁定地址和端口使用 bind (),然後調用 writeDatagram () 和 readDatagram () / receiveDatagram () 去傳輸數據。若想要使用標準 QIODevice 函數 read (), readLine (), write () 等,必須首先把套接字直接連接到對等方,通過調用 connectToHost ().

套接字發射 bytesWritten () 信號,每當數據報被寫入網絡時。若僅僅想要發送數據報,不需要調用 bind ().

The readyRead () 信號被發射,每當數據報到達時。在此情況下, hasPendingDatagrams () 返迴 true 。調用 pendingDatagramSize () 以獲得第一待決數據報的尺寸,和 readDatagram () 或 receiveDatagram () 去讀取它。

注意: 應該讀取傳入數據報當收到 readyRead () 信號時;否則下一數據報不會發射此信號。

範例:

void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7755);
    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(readPendingDatagrams()));
}
void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QNetworkDatagram datagram = udpSocket->receiveDatagram();
        processTheDatagram(datagram);
    }
}
					

QUdpSocket 還支持 UDP 多點播送。使用 joinMulticastGroup () 和 leaveMulticastGroup () 去控製組成員資格,和 QAbstractSocket::MulticastTtlOption and QAbstractSocket::MulticastLoopbackOption 去設置 TTL (生存時間) 和迴送套接字選項。使用 setMulticastInterface () 去控製多點播送數據報的傳齣接口,和 multicastInterface () 去查詢它。

采用 QUdpSocket ,還可以建立到 UDP 服務器的虛擬連接使用 connectToHost () 然後使用 read () 和 write () 去交換數據,不為每數據報指定接收者。

The 廣播發送器 , 廣播接收器 , 多點播送發送器 ,和 多點播送接收器 範例闡明如何使用 QUdpSocket 在應用程序中。

另請參閱 QTcpSocket and QNetworkDatagram .

成員函數文檔編製

QUdpSocket:: QUdpSocket ( QObject * parent = Q_NULLPTR)

創建 QUdpSocket 對象。

parent 被傳遞給 QObject 構造函數。

另請參閱 socketType ().

[虛擬] QUdpSocket:: ~QUdpSocket ()

銷毀套接字,關閉連接 (若有必要)。

另請參閱 close ().

bool QUdpSocket:: hasPendingDatagrams () const

返迴 true 若至少有一數據報等待被讀取;否則返迴 false .

另請參閱 pendingDatagramSize () 和 readDatagram ().

bool QUdpSocket:: joinMulticastGroup (const QHostAddress & groupAddress )

加入多點播送組指定通過 groupAddress 在由操作係統選擇的默認接口。套接字必須處於 BoundState ,否則齣現錯誤。

注意,若試圖加入 IPv4 組,套接字不得使用 IPv6 綁定 (或在雙模式下,使用 QHostAddress::Any )。必須使用 QHostAddress::AnyIPv4 代替。

此函數返迴 true 若成功;否則返迴 false 並設置相應套接字錯誤。

該函數在 Qt 4.8 引入。

另請參閱 leaveMulticastGroup ().

bool QUdpSocket:: joinMulticastGroup (const QHostAddress & groupAddress , const QNetworkInterface & iface )

這是重載函數。

加入多點播送組地址 groupAddress 按接口 iface .

該函數在 Qt 4.8 引入。

另請參閱 leaveMulticastGroup ().

bool QUdpSocket:: leaveMulticastGroup (const QHostAddress & groupAddress )

離開多點播送組指定通過 groupAddress 在由操作係統選擇的默認接口。套接字必須處於 BoundState ,否則齣現錯誤。

此函數返迴 true 若成功;否則返迴 false 並設置相應套接字錯誤。

該函數在 Qt 4.8 引入。

另請參閱 joinMulticastGroup ().

bool QUdpSocket:: leaveMulticastGroup (const QHostAddress & groupAddress , const QNetworkInterface & iface )

這是重載函數。

離開多點播送組指定通過 groupAddress 按接口 iface .

該函數在 Qt 4.8 引入。

另請參閱 joinMulticastGroup ().

QNetworkInterface QUdpSocket:: multicastInterface () const

返迴用於多點播送數據報的傳齣接口的接口。這相當於 IPv4 套接字的 IP_MULTICAST_IF 套接字選項和 IPv6 套接字的 IPV6_MULTICAST_IF 套接字選項。若先前沒有設置接口,此函數返迴無效 QNetworkInterface 。套接字必須處於 BoundState ,否則無效 QNetworkInterface 被返迴。

該函數在 Qt 4.8 引入。

另請參閱 setMulticastInterface ().

qint64 QUdpSocket:: pendingDatagramSize () const

返迴第一待決 UDP 數據報的大小。若沒有可用數據報,此函數返迴 -1。

另請參閱 hasPendingDatagrams () 和 readDatagram ().

qint64 QUdpSocket:: readDatagram ( char * data , qint64 maxSize , QHostAddress * address = Q_NULLPTR, quint16 * port = Q_NULLPTR)

接收數據報不大於 maxSize 字節並把它存儲在 data 。發送器的主機地址和端口存儲在 * address 和 * port (除非指針為 0)。

返迴數據報的大小當成功時;否則返迴 -1。

maxSize 太小,其餘數據報將丟失。為避免數據丟失,調用 pendingDatagramSize () 以確定待決數據報的大小在試圖讀取它之前。若 maxSize 為 0,數據報會被丟棄。

另請參閱 writeDatagram (), hasPendingDatagrams (),和 pendingDatagramSize ().

QNetworkDatagram QUdpSocket:: receiveDatagram ( qint64 maxSize = -1)

接收數據報不大於 maxSize 字節並返迴它在 QNetworkDatagram 對象,除發送者的主機地址和端口外。若可能,此函數還會試著確定數據報的目的地地址、端口及接待時的跳躍計數。

當故障時,返迴 QNetworkDatagram 報告 無效 .

maxSize 太小,其餘數據報將丟失。若 maxSize 為 0,數據報會被丟棄。若 maxSize 為 -1 (默認),此函數將試圖讀取整個數據報。

另請參閱 writeDatagram (), hasPendingDatagrams (),和 pendingDatagramSize ().

void QUdpSocket:: setMulticastInterface (const QNetworkInterface & iface )

將多點播送數據報的傳齣接口設為接口 iface 。這相當於 IPv4 套接字的 IP_MULTICAST_IF 套接字選項和 IPv6 套接字的 IPV6_MULTICAST_IF 套接字選項。套接字必須處於 BoundState ,否則此函數什麼都不做。

該函數在 Qt 4.8 引入。

另請參閱 multicastInterface (), joinMulticastGroup (),和 leaveMulticastGroup ().

qint64 QUdpSocket:: writeDatagram (const char * data , qint64 size , const QHostAddress & address , quint16 port )

發送數據報按 data 的大小 size 到主機地址 address 在端口 port 。返迴發送字節數當成功時;否則返迴 -1。

數據報始終作為一個塊寫入。數據報的最大大小高度從屬平颱,但可以低至 8192 字節。若數據報太大,此函數將返迴 -1 和 error () 會返迴 DatagramTooLargeError .

一般不建議發送大於 512 字節的數據報,因為即使成功發送,它們也可能被 IP 層碎片化在抵達其最終目的地之前。

警告: 在已連接的 UDP 套接字中調用此函數,可能導緻錯誤且不發送數據包。若正使用已連接的套接字,使用 write () 來發送數據報。

另請參閱 readDatagram () 和 write ().

qint64 QUdpSocket:: writeDatagram (const QNetworkDatagram & datagram )

這是重載函數。

發送數據報 datagram 到主機地址和端口號包含在 datagram ,要使用的網絡接口和跳躍計數限製也在那裏設置。若未設置目的地地址和端口號,此函數將發送地址傳遞給 connectToHost ().

若目的地地址是 IPv6 采用非空 作用域 ID 但不同於接口索引在 datagram ,操作係統將選擇發送哪個接口未定義。

函數返迴發送字節數若成功,或 -1 若遭遇錯誤。

警告: 在已連接的 UDP 套接字中調用此函數,可能導緻錯誤且不發送數據包。若正使用已連接的套接字,使用 write () 來發送數據報。

另請參閱 QNetworkDatagram::setDestination (), QNetworkDatagram::setHopLimit (),和 QNetworkDatagram::setInterfaceIndex ().

qint64 QUdpSocket:: writeDatagram (const QByteArray & datagram , const QHostAddress & host , quint16 port )

這是重載函數。

發送數據報 datagram 到主機地址 host 和在端口 port .

函數返迴發送字節數若成功,或 -1 若遭遇錯誤。