QNetworkDatagram Class
Die Klasse QNetworkDatagram liefert die Daten und Metadaten eines UDP-Datagramms. Mehr...
Header: | #include <QNetworkDatagram> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
qmake: | QT += network |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QNetworkDatagram ist Teil der Network Programming API.
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Öffentliche Funktionen
QNetworkDatagram() | |
QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0) | |
QNetworkDatagram(const QNetworkDatagram &other) | |
void | clear() |
QByteArray | data() const |
QHostAddress | destinationAddress() const |
int | destinationPort() const |
int | hopLimit() const |
uint | interfaceIndex() const |
bool | isNull() const |
bool | isValid() const |
QNetworkDatagram | makeReply(const QByteArray &payload) && |
QNetworkDatagram | makeReply(const QByteArray &payload) const & |
QHostAddress | senderAddress() const |
int | senderPort() const |
void | setData(const QByteArray &data) |
void | setDestination(const QHostAddress &address, quint16 port) |
void | setHopLimit(int count) |
void | setInterfaceIndex(uint index) |
void | setSender(const QHostAddress &address, quint16 port = 0) |
void | swap(QNetworkDatagram &other) |
QNetworkDatagram & | operator=(const QNetworkDatagram &other) |
Detaillierte Beschreibung
QNetworkDatagram kann zusammen mit der Klasse QUdpSocket verwendet werden, um die vollständigen Informationen eines UDP-Datagramms (User Datagram Protocol) darzustellen. QNetworkDatagram kapselt die folgenden Informationen eines Datagramms:
- die Nutzdaten;
- die Absenderadresse und Portnummer;
- die Zieladresse und Portnummer;
- die verbleibende Hop-Count-Grenze (bei IPv4 wird dieses Feld gewöhnlich "time to live" - TTL - genannt);
- den Index der Netzwerkschnittstelle, auf der das Datagramm empfangen wurde oder auf der es gesendet werden soll.
QUdpSocket wird versuchen, so weit wie möglich ein gemeinsames Verhalten auf allen Betriebssystemen zu erreichen, aber nicht alle der oben genannten Metadaten können in einigen Betriebssystemen erhalten werden. Metadaten, die beim Senden mit QUdpSocket::writeDatagram() nicht auf das Datagramm gesetzt werden können, werden stillschweigend verworfen.
Beim Empfang enthalten die Eigenschaften senderAddress() und senderPort() die Adresse und den Port der Gegenstelle, die das Datagramm gesendet hat, während destinationAddress() und destinationPort() das Ziel enthalten, das im Datagramm enthalten war. Dabei handelt es sich in der Regel um eine lokale Adresse des aktuellen Rechners, es kann aber auch eine IPv4-Broadcast-Adresse (wie "255.255.255.255") oder eine IPv4- oder IPv6-Multicast-Adresse sein. Für Anwendungen kann es nützlich sein, festzustellen, ob das Datagramm speziell an diesen Rechner per Unicast-Adressierung gesendet wurde oder ob es an mehrere Ziele gesendet wurde.
Beim Senden sollten senderAddress() und senderPort() die lokale Adresse enthalten, die beim Senden verwendet werden soll. Die Absenderadresse muss eine diesem Rechner zugewiesene Adresse sein, die mit QNetworkInterface ermittelt werden kann, und die Portnummer muss die Portnummer sein, an die der Socket gebunden ist. Beide Felder können leer gelassen werden und werden vom Betriebssystem mit Standardwerten ausgefüllt. Die Felder destinationAddress() und destinationPort() können auf eine andere Zieladresse gesetzt werden als die, an die der UDP-Socket derzeit gebunden ist.
Wenn man ein Datagramm als Antwort auf ein zuvor empfangenes Datagramm sendet, wird man normalerweise destinationAddress() auf die senderAddress() des eingehenden Datagramms setzen und ähnlich verhält es sich mit den Portnummern. Um diesen gemeinsamen Prozess zu erleichtern, bietet QNetworkDatagram die Funktion makeReply().
Die Funktion hopCount() enthält für ein empfangenes Datagramm die verbleibende Hopcount-Grenze für das Paket. Beim Senden enthält sie das zu setzende Hopcount-Limit. Die meisten Protokolle belassen diesen Wert auf dem Standardwert und lassen das Betriebssystem entscheiden, welcher Wert am besten zu verwenden ist. Beim Multicasting über IPv4 wird dieses Feld häufig verwendet, um den Geltungsbereich der Multicast-Gruppe anzugeben (link-local, lokal in einer Organisation oder global).
Die Funktion interfaceIndex() enthält den Index der Schnittstelle des Betriebssystems, die das Paket empfangen hat. Dieser Wert ist derselbe, der in einer QHostAddress::scopeId()-Eigenschaft festgelegt werden kann und mit der QNetworkInterface::index()-Eigenschaft übereinstimmt. Beim Senden von Paketen an globale Adressen ist es nicht notwendig, den Schnittstellenindex zu setzen, da das Betriebssystem die richtige Schnittstelle anhand der System-Routing-Tabelle auswählt. Diese Eigenschaft ist wichtig, wenn Datagramme an link-lokale Ziele gesendet werden, egal ob Unicast oder Multicast.
Unterstützung von Merkmalen
Einige Funktionen von QNetworkDatagram werden nicht von allen Betriebssystemen unterstützt. Nur die Adresse und die Ports des entfernten Hosts (Absender bei empfangenen Paketen und Ziel bei ausgehenden Paketen) werden in allen Systemen unterstützt. Auf den meisten Betriebssystemen werden die anderen Funktionen nur für IPv6 unterstützt. Software sollte zur Laufzeit prüfen, ob der Rest für IPv4-Adressen ermittelt werden konnte.
Die derzeitige Unterstützung von Merkmalen ist wie folgt:
Betriebssystem | Lokale Adresse | Hop-Zahl | Schnittstellenindex |
---|---|---|---|
FreeBSD | Unterstützt | Unterstützt | Nur für IPv6 |
Linux | Unterstützt | Unterstützt | Unterstützt |
OS X | Unterstützt | Unterstützt | Nur für IPv6 |
Andere Unix-Systeme, die RFC 3542 unterstützen | Nur für IPv6 | Nur für IPv6 | Nur für IPv6 |
Windows (Desktop) | Unterstützt | Unterstützt | Unterstützt |
Windows RT | Nicht unterstützt | Nicht unterstützt | Nicht unterstützt |
Siehe auch QUdpSocket und QNetworkInterface.
Dokumentation der Mitgliedsfunktionen
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &
Erzeugt ein neues QNetworkDatagram, das eine Antwort auf dieses eingehende Datagramm darstellt, und setzt die Nutzdaten auf payload. Diese Funktion ist eine sehr bequeme Art, auf ein Datagramm zurück an den ursprünglichen Absender zu antworten.
Beispiel:
void Server::readPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket->receiveDatagram(); QByteArray replyData = processThePayload(datagram.data()); udpSocket->writeDatagram(datagram.makeReply(replyData)); } }
Diese Funktion ist besonders praktisch, da sie automatisch Parameter aus diesem Datagramm in das neue Datagramm kopiert, wenn dies erforderlich ist:
- Absenderadresse und Port dieses Datagramms werden in die Zieladresse und den Port des neuen Datagramms kopiert;
- der Schnittstellenindex dieses Datagramms, falls vorhanden, wird in den Schnittstellenindex des neuen Datagramms kopiert;
- die Zieladresse und der Port dieses Datagramms werden nur dann auf die Absenderadresse und den Port des neuen Datagramms kopiert, wenn es sich um eine globale IPv6-Adresse (Nicht-Multicast-Adresse) handelt;
- die Hop-Count-Grenze des neuen Datagramms wird auf den Standardwert (-1) zurückgesetzt;
Wenn QNetworkDatagram in einer zukünftigen Version von Qt geändert wird, um weitere Metadaten zu übertragen, wird diese Funktion diese Metadaten entsprechend kopieren.
Die Zieladresse dieses Datagramms wird nicht kopiert, wenn es sich um eine IPv4-Adresse handelt, da es nicht möglich ist, eine IPv4-Broadcast-Adresse von einer regulären IPv4-Adresse zu unterscheiden, ohne alle diesem Rechner zugewiesenen Adressen zu durchsuchen. Der Versuch, ein Datagramm zu senden, bei dem die Absenderadresse gleich der Broadcast-Adresse ist, wird wahrscheinlich fehlschlagen. Dies sollte die Kommunikation jedoch nicht beeinträchtigen, da Netzwerkschnittstellen mit mehreren IPv4-Adressen selten sind, so dass die vom Betriebssystem gewählte Adresse wahrscheinlich von der Gegenstelle verstanden wird.
Hinweis: Diese Funktion verfügt sowohl über rvalue- als auch über lvalue-Referenzqualifizierungsüberladungen, daher ist es eine gute Idee, vor dem Aufruf von makeReply sicherzustellen, dass dieses Objekt möglichst rvalue ist, um die Semantik von move besser nutzen zu können. Um dies zu erreichen, würde das obige Beispiel verwenden:
udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));
QNetworkDatagram::QNetworkDatagram()
Erzeugt ein QNetworkDatagram-Objekt ohne Nutzdaten und mit undefinierter Zieladresse.
Die Nutzdaten können mit setData() geändert werden, und die Zieladresse kann mit setDestination() festgelegt werden.
Wenn die Zieladresse nicht definiert ist, versucht QUdpSocket::writeDatagram(), das Datagramm an die Adresse zu senden, die zuletzt mit QUdpSocket::connectToHost() verknüpft war.
QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
Erzeugt ein QNetworkDatagram-Objekt und setzt data als Nutzdaten sowie destinationAddress und port als Zieladresse des Datagramms.
QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)
Erzeugt eine Kopie des Datagramms other, einschließlich der Nutzlast und der Metadaten.
Um ein Datagramm zu erstellen, das zum Senden einer Antwort geeignet ist, verwenden Sie QNetworkDatagram::makeReply();
void QNetworkDatagram::clear()
Löscht die Nutzdaten und Metadaten in diesem QNetworkDatagram Objekt und setzt sie auf ihre Standardwerte zurück.
QByteArray QNetworkDatagram::data() const
Gibt die Nutzdaten dieses Datagramms zurück. Bei einem vom Netz empfangenen Datagramm enthält es die Nutzlast des Datagramms. Bei einem ausgehenden Datagramm handelt es sich um das zu sendende Datagramm.
Beachten Sie, dass Datagramme ohne Daten übertragen werden können, so dass die zurückgegebene QByteArray leer sein kann.
Siehe auch setData().
QHostAddress QNetworkDatagram::destinationAddress() const
Gibt die mit diesem Datagramm verbundene Zieladresse zurück. Bei einem aus dem Netz empfangenen Datagramm handelt es sich um die Adresse, an die der Peer-Knoten das Datagramm gesendet hat, die entweder eine lokale Adresse dieses Rechners oder eine Multicast- oder Broadcast-Adresse sein kann. Bei ausgehenden Datagrammen ist dies die Adresse, an die das Datagramm gesendet werden soll.
Wenn für dieses Datagramm keine Zieladresse festgelegt wurde, meldet das zurückgegebene Objekt true an QHostAddress::isNull().
Siehe auch senderAddress(), destinationPort(), und setDestination().
int QNetworkDatagram::destinationPort() const
Gibt die Portnummer des mit diesem Datagramm verbundenen Ziels zurück. Bei einem aus dem Netz empfangenen Datagramm handelt es sich um die lokale Portnummer, an die der Peer-Knoten das Datagramm gesendet hat. Bei einem ausgehenden Datagramm handelt es sich um den Peer-Port, an den das Datagramm gesendet werden sollte.
Wenn diesem Datagramm keine Zieladresse zugeordnet wurde, gibt diese Funktion -1 zurück.
Siehe auch destinationAddress(), senderPort(), und setDestination().
int QNetworkDatagram::hopLimit() const
Gibt die mit diesem Datagramm verknüpfte Hopcount-Grenze zurück. Die Hop-Count-Grenze ist die Anzahl der Knoten, die das IP-Paket weiterleiten dürfen, bevor es abläuft und ein Fehler an den Absender des Datagramms zurückgeschickt wird. In IPv4 wird dieser Wert normalerweise als "time to live" (TTL) bezeichnet.
Wenn dieses Datagramm vom Netz empfangen wurde, ist dies der verbleibende Hop Count des Datagramms nach dem Empfang und wurde von jedem Knoten, der das Paket weitergeleitet hat, um 1 dekrementiert. Ein Wert von -1 zeigt an, dass die Hop-Limit-Anzahl nicht erreicht werden kann.
Handelt es sich um ein ausgehendes Datagramm, ist dies der Wert, der beim Senden in den IP-Header gesetzt wird. Ein Wert von -1 zeigt an, dass das Betriebssystem den Wert wählen sollte.
Siehe auch setHopLimit().
uint QNetworkDatagram::interfaceIndex() const
Gibt den Schnittstellenindex zurück, dem dieses Datagramm zugeordnet ist. Der Schnittstellenindex ist eine positive Zahl, die die Netzwerkschnittstelle im Betriebssystem eindeutig identifiziert. Diese Zahl entspricht dem Wert, der von QNetworkInterface::index() für die Schnittstelle zurückgegeben wird.
Wenn dieses Datagramm vom Netz empfangen wurde, ist dies der Index der Schnittstelle, von der das Paket empfangen wurde. Handelt es sich um ein ausgehendes Datagramm, so ist dies der Index der Schnittstelle, über die das Datagramm gesendet werden soll.
Ein Wert von 0 bedeutet, dass der Schnittstellenindex unbekannt ist.
Siehe auch setInterfaceIndex().
bool QNetworkDatagram::isNull() const
Gibt true zurück, wenn dieses QNetworkDatagram Objekt null ist. Diese Funktion ist das Gegenteil von isValid().
bool QNetworkDatagram::isValid() const
Gibt true zurück, wenn dieses QNetworkDatagram Objekt gültig ist. Ein gültiges QNetworkDatagram Objekt enthält mindestens eine Absender- oder Empfängeradresse. Gültige Datagramme können leere Payloads enthalten.
QHostAddress QNetworkDatagram::senderAddress() const
Gibt die mit diesem Datagramm verbundene Absenderadresse zurück. Bei einem aus dem Netz empfangenen Datagramm handelt es sich um die Adresse des Peer-Knotens, der das Datagramm gesendet hat. Bei einem ausgehenden Datagramm ist es die lokale Adresse, die beim Senden verwendet wird.
Wenn für dieses Datagramm keine Absenderadresse festgelegt wurde, meldet das zurückgegebene Objekt true an QHostAddress::isNull().
Siehe auch destinationAddress(), senderPort(), und setSender().
int QNetworkDatagram::senderPort() const
Gibt die Portnummer des mit diesem Datagramm verbundenen Absenders zurück. Bei einem aus dem Netz empfangenen Datagramm handelt es sich um die Portnummer, von der aus der Peer-Knoten das Datagramm gesendet hat. Bei einem ausgehenden Datagramm handelt es sich um den lokalen Port, von dem aus das Datagramm gesendet werden sollte.
Wenn diesem Datagramm keine Absenderadresse zugeordnet wurde, gibt diese Funktion -1 zurück.
Siehe auch senderAddress(), destinationPort(), und setSender().
void QNetworkDatagram::setData(const QByteArray &data)
Setzt die Datennutzlast dieses Datagramms auf data. Es ist normalerweise nicht notwendig, diese Funktion bei empfangenen Datagrammen aufzurufen. Für ausgehende Datagramme legt diese Funktion die Daten fest, die über das Netz gesendet werden sollen.
Da Datagramme leer sein können, ist ein leeres QByteArray ein gültiger Wert für data.
Siehe auch data().
void QNetworkDatagram::setDestination(const QHostAddress &address, quint16 port)
Setzt die mit diesem Datagramm verknüpfte Zieladresse auf die Adresse address und die Portnummer port. Die Zieladresse und die Portnummern werden normalerweise von QUdpSocket beim Empfang gesetzt, so dass es nicht notwendig ist, diese Funktion für ein empfangenes Datagramm aufzurufen.
Für ausgehende Datagramme kann diese Funktion verwendet werden, um die Adresse festzulegen, an die das Datagramm gesendet werden soll. Dabei kann es sich um die Unicast-Adresse handeln, die für die Kommunikation mit der Gegenstelle verwendet wird, oder um eine Broadcast- oder Multicast-Adresse, die an eine Gruppe von Geräten gesendet wird.
Siehe auch QUdpSocket::writeDatagram(), destinationAddress(), destinationPort(), und setSender().
void QNetworkDatagram::setHopLimit(int count)
Setzt das diesem Datagramm zugeordnete Hop-Count-Limit auf count. Das Hop-Count-Limit ist die Anzahl der Knoten, die das IP-Paket weiterleiten dürfen, bevor es abläuft und ein Fehler an den Absender des Datagramms zurückgeschickt wird. In IPv4 wird dieser Wert gewöhnlich als "time to live" (TTL) bezeichnet.
Bei Datagrammen, die vom Netz empfangen werden, ist es normalerweise nicht notwendig, diese Funktion aufzurufen.
Handelt es sich um ein ausgehendes Paket, ist dies der Wert, der beim Senden in den IP-Header gesetzt wird. Der gültige Bereich für den Wert ist 1 bis 255. Diese Funktion akzeptiert auch einen Wert von -1, um anzugeben, dass das Betriebssystem den Wert wählen soll.
Siehe auch hopLimit().
void QNetworkDatagram::setInterfaceIndex(uint index)
Setzt den Schnittstellenindex, dem dieses Datagramm zugeordnet ist, auf index. Der Schnittstellenindex ist eine positive Zahl, die die Netzwerkschnittstelle im Betriebssystem eindeutig identifiziert. Diese Zahl entspricht dem Wert, der von QNetworkInterface::index() für die Schnittstelle zurückgegeben wird.
Normalerweise ist es nicht notwendig, diese Funktion bei Datagrammen, die vom Netz empfangen werden, aufzurufen.
Handelt es sich um ein ausgehendes Paket, ist dies der Index der Schnittstelle, über die das Datagramm gesendet werden soll. Ein Wert von 0 zeigt an, dass das Betriebssystem die Schnittstelle auf der Grundlage anderer Faktoren auswählen sollte.
Beachten Sie, dass der Schnittstellenindex für IPv6-Zieladressen auch mit QHostAddress::setScopeId() und anschließend mit setDestination() gesetzt werden kann. Wenn die Scope-ID in der Zieladresse und index unterschiedlich sind und keine davon Null ist, ist es unbestimmt, über welche Schnittstelle das Betriebssystem das Datagramm senden wird.
Siehe auch interfaceIndex() und setInterfaceIndex().
void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)
Setzt die Absenderadresse, die mit diesem Datagramm verbunden ist, auf die Adresse address und die Portnummer port. Die Absenderadresse und die Portnummern werden normalerweise von QUdpSocket beim Empfang gesetzt, so dass es nicht notwendig ist, diese Funktion für ein empfangenes Datagramm aufzurufen.
Für ausgehende Datagramme kann diese Funktion verwendet werden, um die Adresse zu setzen, die das Datagramm tragen soll. Die Adresse address muss in der Regel eine der diesem Rechner zugewiesenen lokalen Adressen sein, die mit QNetworkInterface ermittelt werden kann. Wird sie nicht angegeben, wählt das Betriebssystem die für das betreffende Ziel am besten geeignete Adresse.
Die Portnummer port muss die Portnummer sein, die mit dem Socket verbunden ist, sofern ein solcher vorhanden ist. Der Wert 0 kann verwendet werden, um anzuzeigen, dass das Betriebssystem die Portnummer wählen soll.
Siehe auch QUdpSocket::writeDatagram(), senderAddress(), senderPort(), und setDestination().
[noexcept]
void QNetworkDatagram::swap(QNetworkDatagram &other)
Tauscht dieses Datagramm mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.
QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)
Kopiert das Datagramm other, einschließlich der Nutzlast und der Metadaten.
Um ein Datagramm zu erstellen, das zum Senden einer Antwort geeignet ist, verwenden Sie QNetworkDatagram::makeReply();
© 2025 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.