QNetworkDatagram Class
Die Klasse `QNetworkDatagram` stellt die Daten und Metadaten eines UDP-Datagramms bereit. 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 Netzwerkprogrammier-API.
Hinweis: Alle Funktionen 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) |
Ausführliche 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 die Portnummer;
- die Zieladresse und Portnummer;
- die verbleibende Anzahl der Hop-Schritte (bei IPv4 wird dieses Feld üblicherweise als „Time to Live“ – TTL – bezeichnet);
- den Index der Netzwerkschnittstelle, über die das Datagramm empfangen wurde oder gesendet werden soll.
QUdpSocket Es wird versucht, das Verhalten auf allen Betriebssystemen so weit wie möglich zu vereinheitlichen, jedoch können in einigen Betriebssystemen nicht alle der oben genannten Metadaten abgerufen werden. Metadaten, die beim Senden mit ` QUdpSocket::writeDatagram()` nicht im Datagramm gesetzt werden können, werden stillschweigend verworfen.
Beim Empfang enthalten die Eigenschaften ` senderAddress()` und ` senderPort()` die Adresse und den Port des Peers, der das Datagramm gesendet hat, während ` destinationAddress()` und ` destinationPort()` das im Datagramm enthaltene Ziel enthalten. Dies ist in der Regel eine lokale Adresse des aktuellen Rechners, es kann sich jedoch auch um eine IPv4-Broadcast-Adresse (wie „255.255.255.255“) oder eine IPv4- bzw. IPv6-Multicast-Adresse handeln. Für Anwendungen kann es nützlich sein, festzustellen, ob das Datagramm per Unicast-Adressierung speziell an diesen Rechner gesendet wurde oder ob es an mehrere Ziele gesendet wurde.
Beim Senden sollten die Felder „ senderAddress()“ und „ senderPort()“ die lokale Adresse enthalten, die beim Senden verwendet werden soll. Die Absenderadresse muss eine diesem Rechner zugewiesene Adresse sein, die über „ QNetworkInterface “ abgerufen werden kann, und die Portnummer muss die Portnummer sein, an die der Socket gebunden ist. Beide Felder können ungesetzt bleiben und werden dann vom Betriebssystem mit Standardwerten gefüllt. Die Felder „ destinationAddress()“ und „ destinationPort()“ können auf eine Zieladresse gesetzt werden, die sich von derjenigen unterscheidet, mit der der UDP-Socket derzeit verknüpft ist.
Normalerweise wird beim Senden eines Datagramms als Antwort auf ein zuvor empfangenes Datagramm die „ destinationAddress “ () auf die „ senderAddress “ () des eingehenden Datagramms gesetzt, ebenso wie die Portnummern. Um diesen gängigen Vorgang zu vereinfachen, stellt QNetworkDatagram die Funktion „ makeReply “ () bereit.
Die Funktion `hopCount()` enthält für ein empfangenes Datagramm die verbleibende Hop-Count-Grenze für das Paket. Beim Senden enthält sie die festzulegende Hop-Count-Grenze. Die meisten Protokolle belassen diesen Wert auf der Standardeinstellung und überlassen es dem Betriebssystem, den besten Wert zu bestimmen. Beim Multicasting über IPv4 wird dieses Feld häufig verwendet, um den Geltungsbereich der Multicast-Gruppe anzugeben (link-local, lokal für eine Organisation oder global).
Die Funktion „ interfaceIndex “ () enthält den Index der Schnittstelle des Betriebssystems, die das Paket empfangen hat. Dieser Wert entspricht dem Wert, der über die Eigenschaft „ QHostAddress::scopeId “ () festgelegt werden kann, und stimmt mit der Eigenschaft „ QNetworkInterface::index “ () überein. Beim Senden von Paketen an globale Adressen ist es nicht erforderlich, den Schnittstellenindex festzulegen, da das Betriebssystem anhand der System-Routing-Tabelle die richtige Schnittstelle auswählt. Diese Eigenschaft ist wichtig beim Senden von Datagrammen an link-lokale Ziele, unabhängig davon, ob es sich um Unicast oder Multicast handelt.
Funktionsunterstützung
Einige Funktionen von `QNetworkDatagram` werden nicht in allen Betriebssystemen unterstützt. Nur die Adresse und die Ports des Remote-Hosts (Absender bei empfangenen Paketen und Ziel bei ausgehenden Paketen) werden in allen Systemen unterstützt. Auf den meisten Betriebssystemen werden die übrigen Funktionen nur für IPv6 unterstützt. Die Software sollte zur Laufzeit prüfen, ob die übrigen Angaben für IPv4-Adressen ermittelt werden können.
Die aktuelle Funktionsunterstützung sieht wie folgt aus:
| 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 zu den Member-Funktionen
QNetworkDatagram::QNetworkDatagram()
Erstellt ein QNetworkDatagram-Objekt ohne Nutzdaten und mit undefinierter Zieladresse.
Die Nutzdaten können mit ` setData()` geändert und die Zieladresse mit ` setDestination()` festgelegt werden.
Wird die Zieladresse nicht festgelegt, versucht ` QUdpSocket::writeDatagram()` (), das Datagramm an die Adresse zu senden, die zuletzt über ` QUdpSocket::connectToHost()` () zugeordnet wurde.
QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
Erstellt ein QNetworkDatagram-Objekt und legt data als Nutzdaten fest, zusammen mit destinationAddress und port als Zieladressen des Datagramms.
QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)
Erstellt eine Kopie des Datagramms „ other “, einschließlich der Nutzdaten und Metadaten.
Um ein Datagramm zu erstellen, das für den Versand 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 Daten-Nutzlast dieses Datagramms zurück. Bei einem vom Netzwerk empfangenen Datagramm enthält sie die Nutzlast des Datagramms. Bei einem ausgehenden Datagramm handelt es sich um das zu sendende Datagramm.
Beachten Sie, dass Datagramme auch ohne Daten übertragen werden können, sodass die zurückgegebene ` QByteArray ` leer sein kann.
Siehe auch ` setData()`.
QHostAddress QNetworkDatagram::destinationAddress() const
Gibt die diesem Datagramm zugeordnete Zieladresse zurück. Bei einem vom Netzwerk empfangenen Datagramm handelt es sich um die Adresse, an die der Partnerknoten das Datagramm gesendet hat; dabei kann es sich entweder um eine lokale Adresse dieses Rechners oder um eine Multicast- oder Broadcast-Adresse handeln. Bei ausgehenden Datagrammen ist es die Adresse, an die das Datagramm gesendet werden soll.
Wenn für dieses Datagramm keine Zieladresse festgelegt wurde, gibt das zurückgegebene Objekt bei der Funktion „ QHostAddress::isNull()“ den Wert „true“ zurück.
Siehe auch „ senderAddress()“, „ destinationPort()“ und „ setDestination()“.
int QNetworkDatagram::destinationPort() const
Gibt die Portnummer des Ziels zurück, das diesem Datagramm zugeordnet ist. Bei einem vom Netzwerk empfangenen Datagramm handelt es sich um die lokale Portnummer, an die der Partnerknoten das Datagramm gesendet hat. Bei einem ausgehenden Datagramm handelt es sich um den Port des Partners, an den das Datagramm gesendet werden soll.
Wenn diesem Datagramm keine Zieladresse zugeordnet war, gibt diese Funktion -1 zurück.
Siehe auch destinationAddress(), senderPort() und setDestination().
int QNetworkDatagram::hopLimit() const
Gibt die mit diesem Datagramm verbundene Hop-Count-Begrenzung zurück. Die Hop-Count-Begrenzung ist die Anzahl der Knoten, die das IP-Paket weiterleiten dürfen, bevor es abläuft und eine Fehlermeldung an den Absender des Datagramms zurückgesendet wird. In IPv4 wird dieser Wert üblicherweise als „Time to Live“ (TTL) bezeichnet.
Wurde dieses Datagramm aus dem Netzwerk empfangen, entspricht dies der verbleibenden Hop-Anzahl des Datagramms nach dem Empfang, die von jedem Knoten, der das Paket weitergeleitet hat, um 1 verringert wurde. Ein Wert von -1 bedeutet, dass die Hop-Anzahl nicht ermittelt werden konnte.
Handelt es sich um ein ausgehendes Datagramm, ist dies der Wert, der beim Versand im IP-Header gesetzt werden soll. Ein Wert von -1 bedeutet, dass das Betriebssystem den Wert selbst wählen soll.
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 der Funktion ` QNetworkInterface::index()` für die Schnittstelle zurückgegeben wird.
Wurde dieses Datagramm aus dem Netzwerk empfangen, ist dies der Index der Schnittstelle, von der das Paket empfangen wurde. Handelt es sich um ein ausgehendes Datagramm, ist dies der Index der Schnittstelle, über die das Datagramm gesendet werden soll.
Der Wert 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 Nutzdaten enthalten.
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &
Erstellt ein neues ` QNetworkDatagram `, das eine Antwort auf dieses eingehende Datagramm darstellt, und setzt die Nutzdaten auf ` payload`. Diese Funktion ist eine sehr bequeme Möglichkeit, ein Datagramm als Antwort an den ursprünglichen Absender zurückzusenden.
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 Parameter aus diesem Datagramm automatisch und entsprechend in das neue Datagramm kopiert:
- Die Absenderadresse und der 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 in die Absenderadresse und den Port des neuen Datagramms kopiert, wenn es sich um eine globale IPv6-Adresse (keine Multicast-Adresse) handelt;
- die Hop-Count-Begrenzung des neuen Datagramms wird auf den Standardwert (-1) zurückgesetzt;
Sollte ` QNetworkDatagram ` in einer zukünftigen Version von Qt so geändert werden, dass es weitere Metadaten enthält, kopiert diese Funktion diese Metadaten entsprechend.
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 vollständig zu durchsuchen. Der Versuch, ein Datagramm mit einer Absenderadresse zu senden, die der Broadcast-Adresse entspricht, wird wahrscheinlich fehlschlagen. Dies sollte die Kommunikation jedoch nicht beeinträchtigen, da Netzwerkschnittstellen mit mehreren IPv4-Adressen selten sind; daher wird die vom Betriebssystem ausgewählte Adresse wahrscheinlich eine sein, die der Gegenüber versteht.
Hinweis: Diese Funktion verfügt sowohl über Überladungen für rvalue- als auch für lvalue-Referenzqualifizierer. Daher ist es ratsam, vor dem Aufruf von ` makeReply` nach Möglichkeit sicherzustellen, dass es sich bei diesem Objekt um einen rvalue handelt, um die Move-Semantik besser nutzen zu können. Um dies zu erreichen, würde im obigen Beispiel Folgendes verwendet werden:
udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));QHostAddress QNetworkDatagram::senderAddress() const
Gibt die diesem Datagramm zugeordnete Absenderadresse zurück. Bei einem vom Netzwerk empfangenen Datagramm handelt es sich um die Adresse des Gegenknotens, der das Datagramm gesendet hat. Bei ausgehenden Datagrammen ist es die lokale Adresse, die beim Senden verwendet wird.
Wenn für dieses Datagramm keine Absenderadresse festgelegt wurde, gibt das zurückgegebene Objekt bei einem Aufruf von ` QHostAddress::isNull()` den Wert „true“ zurück.
Siehe auch destinationAddress(), senderPort() und setSender().
int QNetworkDatagram::senderPort() const
Gibt die Portnummer des Absenders zurück, die diesem Datagramm zugeordnet ist. Bei einem vom Netzwerk empfangenen Datagramm handelt es sich um die Portnummer, von der aus der Partnerknoten das Datagramm gesendet hat. Bei einem ausgehenden Datagramm handelt es sich um den lokalen Port, von dem aus das Datagramm gesendet werden soll.
Wenn diesem Datagramm keine Absenderadresse zugeordnet war, gibt diese Funktion -1 zurück.
Siehe auch senderAddress(), destinationPort() und setSender().
void QNetworkDatagram::setData(const QByteArray &data)
Setzt die Datenlast dieses Datagramms auf data. In der Regel ist es nicht erforderlich, diese Funktion für empfangene Datagramme aufzurufen. Bei ausgehenden Datagrammen legt diese Funktion die Daten fest, die über das Netzwerk 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)
Legt die diesem Datagramm zugeordnete Zieladresse auf die Adresse address und die Portnummer port fest. Die Zieladresse und die Portnummern werden in der Regel beim Empfang von QUdpSocket festgelegt, sodass es nicht erforderlich ist, diese Funktion für ein empfangenes Datagramm aufzurufen.
Bei ausgehenden Datagrammen 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 dem Peer verwendet wird, oder um eine Broadcast- oder Multicast-Adresse, um an eine Gruppe von Geräten zu senden.
Siehe auch QUdpSocket::writeDatagram(), destinationAddress(), destinationPort() und setSender().
void QNetworkDatagram::setHopLimit(int count)
Setzt die mit diesem Datagramm verbundene Hop-Count-Grenze auf „ count “. Die Hop-Count-Grenze gibt die Anzahl der Knoten an, die das IP-Paket weiterleiten dürfen, bevor es verfällt und eine Fehlermeldung an den Absender des Datagramms zurückgesendet wird. In IPv4 wird dieser Wert üblicherweise als „Time to Live“ (TTL) bezeichnet.
Es ist in der Regel nicht erforderlich, diese Funktion für vom Netzwerk empfangene Datagramme aufzurufen.
Handelt es sich um ein ausgehendes Paket, ist dies der Wert, der beim Versenden im IP-Header gesetzt werden soll. Der gültige Wertebereich liegt zwischen 1 und 255. Diese Funktion akzeptiert auch den Wert -1, um anzugeben, dass das Betriebssystem den Wert selbst 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 der Funktion „ QNetworkInterface::index()“ für die Schnittstelle zurückgegeben wird.
Normalerweise ist es nicht erforderlich, diese Funktion für vom Netzwerk empfangene Datagramme aufzurufen.
Handelt es sich um ein ausgehendes Paket, ist dies der Index der Schnittstelle, über die das Datagramm gesendet werden soll. Der Wert 0 bedeutet, dass das Betriebssystem die Schnittstelle anhand anderer Faktoren auswählen soll.
Beachten Sie, dass der Schnittstellenindex für IPv6-Zieladressen auch mit ` QHostAddress::setScopeId()` und anschließend mit ` setDestination()` festgelegt werden kann. Wenn die in der Zieladresse festgelegte Scope-ID und die in ` index ` festgelegte Scope-ID unterschiedlich sind und keine von beiden Null ist, ist es undefiniert, über welche Schnittstelle das Betriebssystem das Datagramm versendet.
Siehe auch interfaceIndex().
void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)
Legt die diesem Datagramm zugeordnete Absenderadresse auf die Adresse address und die Portnummer port fest. Die Absenderadresse und die Portnummern werden in der Regel beim Empfang von QUdpSocket festgelegt, sodass es nicht erforderlich ist, diese Funktion für ein empfangenes Datagramm aufzurufen.
Bei ausgehenden Datagrammen kann diese Funktion verwendet werden, um die Adresse festzulegen, die das Datagramm enthalten soll. Die Adresse address muss in der Regel eine der lokalen Adressen sein, die diesem Rechner zugewiesen sind; diese können mit QNetworkInterface abgerufen werden. Wird sie nicht festgelegt, wählt das Betriebssystem die für das jeweilige Ziel am besten geeignete Adresse aus.
Die Portnummer port muss die dem Socket zugeordnete Portnummer sein, sofern vorhanden. Der Wert 0 kann verwendet werden, um anzugeben, dass das Betriebssystem die Portnummer auswä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 niemals fehl.
QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)
Kopiert das Datagramm „ other “, einschließlich der Nutzdaten und Metadaten.
Um ein Datagramm zu erstellen, das für den Versand einer Antwort geeignet ist, verwenden Sie „ QNetworkDatagram::makeReply()“;
© 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.