Auf dieser Seite

QUdpSocket Class

Die Klasse „QUdpSocket“ stellt einen UDP-Socket bereit. Mehr...

Header: #include <QUdpSocket>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
Erbt: QAbstractSocket

Hinweis: Alle Funktionen dieser Klasse sind reentrant.

Öffentliche Funktionen

QUdpSocket(QObject *parent = 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 = nullptr, quint16 *port = 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)

Ausführliche Beschreibung

UDP (User Datagram Protocol) ist ein schlankes, unzuverlässiges, datagrammorientiertes und verbindungsloses Protokoll. Es kann verwendet werden, wenn Zuverlässigkeit keine Rolle spielt. QUdpSocket ist eine Unterklasse von „ QAbstractSocket “, die es Ihnen ermöglicht, UDP-Datagramme zu senden und zu empfangen.

Die gängigste Vorgehensweise bei der Verwendung dieser Klasse besteht darin, mithilfe von ` bind()` eine Bindung an eine Adresse und einen Port herzustellen und anschließend die Methoden ` writeDatagram()`, ` readDatagram()` bzw. ` receiveDatagram()` aufzurufen, um Daten zu übertragen. Wenn Sie die Standardfunktionen von ` QIODevice ` wie ` read()`, ` readLine()`, ` write()` usw. verwenden möchten, müssen Sie den Socket zunächst durch Aufruf von ` connectToHost()` direkt mit einem Peer verbinden.

Der Socket sendet jedes Mal das Signal „ bytesWritten()“, wenn ein Datagramm ins Netzwerk geschrieben wird. Wenn Sie lediglich Datagramme senden möchten, müssen Sie „ bind()“ nicht aufrufen.

Das Signal „ readyRead()“ wird immer dann ausgelöst, wenn Datagramme eintreffen. In diesem Fall gibt „ hasPendingDatagrams()“ den Wert „ true “ zurück. Rufen Sie „ pendingDatagramSize()“ auf, um die Größe des ersten anstehenden Datagramms zu ermitteln, und „ readDatagram()“ oder „ receiveDatagram()“, um es zu lesen.

Hinweis: Ein eingehendes Datagramm sollte gelesen werden, sobald Sie das Signal „ readyRead()“ erhalten; andernfalls wird dieses Signal für das nächste Datagramm nicht mehr ausgegeben.

Beispiel:

void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7755);

    connect(udpSocket, &QUdpSocket::readyRead,
            this, &Server::readPendingDatagrams);
}

void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QNetworkDatagram datagram = udpSocket->receiveDatagram();
        processTheDatagram(datagram);
    }
}

QUdpSocket unterstützt auch UDP-Multicast. Verwenden Sie „ joinMulticastGroup()“ und „ leaveMulticastGroup()“, um die Gruppenzugehörigkeit zu steuern, sowie „ QAbstractSocket::MulticastTtlOption “ und „ QAbstractSocket::MulticastLoopbackOption “, um die TTL- und Loopback-Socket-Optionen festzulegen. Verwenden Sie „ setMulticastInterface()“, um die Ausgangsschnittstelle für Multicast-Datagramme zu steuern, und „ multicastInterface()“, um diese abzufragen.

Mit QUdpSocket können Sie außerdem mithilfe von ` connectToHost()` eine virtuelle Verbindung zu einem UDP-Server herstellen und anschließend mit ` read()` und ` write()` Datagramme austauschen, ohne den Empfänger für jedes einzelne Datagramm angeben zu müssen.

Die Beispiele „Broadcast Sender“, „Broadcast Receiver“, „Multicast Sender“ und „Multicast Receiver“ veranschaulichen die Verwendung von QUdpSocket in Anwendungen.

Siehe auch „ QTcpSocket “ und „ QNetworkDatagram “.

Dokumentation zu den Mitgliedsfunktionen

[explicit] QUdpSocket::QUdpSocket(QObject *parent = nullptr)

Erstellt ein QUdpSocket-Objekt.

parent wird an den Konstruktor von ` QObject ` übergeben.

Siehe auch socketType().

[virtual noexcept] QUdpSocket::~QUdpSocket()

Löscht den Socket und schließt gegebenenfalls die Verbindung.

Siehe auch „ close()“.

bool QUdpSocket::hasPendingDatagrams() const

Gibt „ true “ zurück, wenn mindestens ein Datagramm zum Lesen ansteht; andernfalls wird „ false “ zurückgegeben.

Siehe auch pendingDatagramSize() und readDatagram().

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

Tritt der durch „ groupAddress “ angegebenen Multicast-Gruppe auf der vom Betriebssystem ausgewählten Standardschnittstelle bei. Der Socket muss sich im „BoundState“ befinden, andernfalls tritt ein Fehler auf.

Beachten Sie: Wenn Sie versuchen, einer IPv4-Gruppe beizutreten, darf Ihr Socket nicht über IPv6 (oder im Dual-Modus über ` QHostAddress::Any`) gebunden sein. Verwenden Sie stattdessen ` QHostAddress::AnyIPv4 `.

Diese Funktion gibt bei Erfolg „ true “ zurück; andernfalls gibt sie „ false “ zurück und setzt den Socket-Fehler entsprechend.

Hinweis: Das Beitreten zu IPv6-Multicast-Gruppen ohne Schnittstellenauswahl wird nicht auf allen Betriebssystemen unterstützt. Ziehen Sie die Verwendung der Überladung in Betracht, bei der die Schnittstelle angegeben wird.

Siehe auch ` leaveMulticastGroup()`.

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

Tritt der Multicast-Gruppenadresse groupAddress auf der Schnittstelle iface bei.

Dies ist eine überladene Funktion.

Siehe auch leaveMulticastGroup().

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

Verlässt die durch groupAddress angegebene Multicast-Gruppe auf der vom Betriebssystem ausgewählten Standard-Schnittstelle. Der Socket muss sich im BoundState befinden, andernfalls tritt ein Fehler auf.

Diese Funktion gibt bei Erfolg „ true “ zurück; andernfalls gibt sie „ false “ zurück und setzt den Socket-Fehler entsprechend.

Hinweis: Diese Funktion sollte mit denselben Argumenten aufgerufen werden, die an ` joinMulticastGroup()` übergeben wurden.

Siehe auch ` joinMulticastGroup()`.

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

Verlässt die durch „ groupAddress “ angegebene Multicast-Gruppe auf der Schnittstelle „ iface “.

Hinweis: Diese Funktion sollte mit denselben Argumenten aufgerufen werden, die an ` joinMulticastGroup()` übergeben wurden.

Dies ist eine überladene Funktion.

Siehe auch joinMulticastGroup().

QNetworkInterface QUdpSocket::multicastInterface() const

Gibt die Schnittstelle für den ausgehenden Datenverkehr von Multicast-Datagrammen zurück. Dies entspricht der Socket-Option `IP_MULTICAST_IF` für IPv4-Sockets und der Socket-Option `IPV6_MULTICAST_IF` für IPv6-Sockets. Wenn zuvor keine Schnittstelle festgelegt wurde, gibt diese Funktion einen ungültigen ` QNetworkInterface` zurück. Der Socket muss sich im `BoundState` befinden, andernfalls wird ein ungültiger ` QNetworkInterface ` zurückgegeben.

Siehe auch setMulticastInterface().

qint64 QUdpSocket::pendingDatagramSize() const

Gibt die Größe des ersten ausstehenden UDP-Datagramms zurück. Ist kein Datagramm vorhanden, gibt diese Funktion -1 zurück.

Siehe auch hasPendingDatagrams() und readDatagram().

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

Empfängt ein Datagramm, das nicht größer als maxSize Byte ist, und speichert es in data. Die Host-Adresse und der Port des Absenders werden in *address und *port gespeichert (es sei denn, die Zeiger sind nullptr).

Gibt bei Erfolg die Größe des Datagramms zurück; andernfalls wird -1 zurückgegeben.

Ist maxSize zu klein, geht der Rest des Datagramms verloren. Um Datenverlust zu vermeiden, rufen Sie pendingDatagramSize() auf, um die Größe des anstehenden Datagramms zu ermitteln, bevor Sie versuchen, es zu lesen. Ist maxSize gleich 0, wird das Datagramm verworfen.

Siehe auch writeDatagram(), hasPendingDatagrams() und pendingDatagramSize().

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

Empfängt ein Datagramm, das nicht größer als maxSize Bytes ist, und gibt es im Objekt „ QNetworkDatagram “ zusammen mit der Host-Adresse und dem Port des Absenders zurück. Wenn möglich, versucht diese Funktion außerdem, die Zieladresse und den Zielport des Datagramms sowie die Anzahl der Hops zum Zeitpunkt des Empfangs zu ermitteln.

Bei einem Fehler wird ein ` QNetworkDatagram ` zurückgegeben, das ` not valid` meldet.

Ist ` maxSize ` zu klein, geht der Rest des Datagramms verloren. Ist ` maxSize ` gleich 0, wird das Datagramm verworfen. Ist ` maxSize ` gleich -1 (Standardwert), versucht diese Funktion, das gesamte Datagramm zu lesen.

Siehe auch writeDatagram(), hasPendingDatagrams() und pendingDatagramSize().

void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)

Legt die Ausgangsschnittstelle für Multicast-Datagramme auf die Schnittstelle iface fest. Dies entspricht der Socket-Option IP_MULTICAST_IF für IPv4-Sockets und der Socket-Option IPV6_MULTICAST_IF für IPv6-Sockets. Der Socket muss sich im BoundState befinden, andernfalls führt diese Funktion keine Aktion aus.

Siehe auch multicastInterface(), joinMulticastGroup() und leaveMulticastGroup().

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

Sendet das Datagramm unter der Adresse data mit einer Größe von size an die Host-Adresse address auf Port port. Gibt bei Erfolg die Anzahl der gesendeten Bytes zurück; andernfalls wird -1 zurückgegeben.

Datagramme werden immer als ein Block geschrieben. Die maximale Größe eines Datagramms ist stark plattformabhängig, kann jedoch bis zu 8192 Byte betragen. Ist das Datagramm zu groß, gibt diese Funktion -1 zurück, und error() gibt DatagramTooLargeError zurück.

Vom Senden von Datagrammen, die größer als 512 Bytes sind, wird generell abgeraten, da diese selbst bei erfolgreicher Übertragung wahrscheinlich von der IP-Schicht fragmentiert werden, bevor sie ihr endgültiges Ziel erreichen.

Warnung: Der Aufruf dieser Funktion bei einem verbundenen UDP-Socket kann zu einem Fehler führen und dazu, dass kein Paket gesendet wird. Wenn Sie einen verbundenen Socket verwenden, nutzen Sie write() zum Senden von Datagrammen.

Siehe auch ` readDatagram()` und ` write()`.

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

Sendet das Datagramm datagram an die in datagram enthaltenen Host-Adressen und Portnummern unter Verwendung der dort ebenfalls festgelegten Grenzwerte für die Netzwerkschnittstelle und die Hop-Anzahl. Sind die Zieladresse und die Portnummern nicht festgelegt, sendet diese Funktion an die Adresse, die an connectToHost() übergeben wurde.

Ist die Zieladresse eine IPv6-Adresse mit einem nicht leeren ` scope id `, weicht jedoch vom Schnittstellenindex in ` datagram` ab, ist es undefiniert, welche Schnittstelle das Betriebssystem für den Versand wählt.

Die Funktion gibt die Anzahl der gesendeten Bytes zurück, wenn der Vorgang erfolgreich war, oder -1, wenn ein Fehler aufgetreten ist.

Warnung: Der Aufruf dieser Funktion bei einem verbundenen UDP-Socket kann zu einem Fehler führen, und es wird möglicherweise kein Paket gesendet. Wenn Sie einen verbundenen Socket verwenden, nutzen Sie write(), um Datagramme zu senden.

Dies ist eine überladene Funktion.

Siehe auch ` QNetworkDatagram::setDestination()`, ` QNetworkDatagram::setHopLimit()` und ` QNetworkDatagram::setInterfaceIndex()`.

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

Sendet das Datagramm datagram an die Host-Adresse host und den Port port.

Die Funktion gibt die Anzahl der gesendeten Bytes zurück, wenn der Vorgang erfolgreich war, oder -1, wenn ein Fehler aufgetreten ist.

Dies ist eine überladene Funktion.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.