QNetworkDatagram Class
La classe QNetworkDatagram fournit les données et les métadonnées d'un datagramme UDP. Plus d'informations...
| En-tête : | #include <QNetworkDatagram> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Network)target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake : | QT += network |
- Liste de tous les membres, y compris les membres hérités
- QNetworkDatagram fait partie de l'API de programmation réseau.
Note : Toutes les fonctions de cette classe sont réentrantes.
Fonctions publiques
| 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) |
Description détaillée
QNetworkDatagram peut être utilisé avec la classe QUdpSocket pour représenter l'ensemble des informations contenues dans un datagramme UDP (User Datagram Protocol). QNetworkDatagram encapsule les informations suivantes d'un datagramme :
- les données de la charge utile ;
- l'adresse et le numéro de port de l'expéditeur ;
- l'adresse de destination et le numéro de port ;
- la limite du nombre de sauts restants (sur IPv4, ce champ est généralement appelé "time to live" - TTL) ;
- l'index de l'interface réseau sur laquelle le datagramme a été reçu ou doit être envoyé.
QUdpSocket Le système d'exploitation de l'UE essaiera autant que possible d'adopter un comportement commun à tous les systèmes d'exploitation, mais toutes les métadonnées ci-dessus ne peuvent pas être obtenues dans certains systèmes d'exploitation. Les métadonnées qui ne peuvent pas être définies sur le datagramme lors de l'envoi avec QUdpSocket::writeDatagram() seront rejetées silencieusement.
À la réception, les propriétés senderAddress() et senderPort() contiennent l'adresse et le port de l'homologue qui a envoyé le datagramme, tandis que destinationAddress() et destinationPort() contiennent la cible contenue dans le datagramme. Il s'agit généralement d'une adresse locale à la machine actuelle, mais il peut également s'agir d'une adresse de diffusion IPv4 (telle que "255.255.255.255") ou d'une adresse de multidiffusion IPv4 ou IPv6. Les applications peuvent trouver utile de déterminer si le datagramme a été envoyé spécifiquement à cette machine via l'adressage unicast ou s'il a été envoyé à plusieurs destinations.
Lors de l'envoi, les adresses senderAddress() et senderPort() doivent contenir l'adresse locale à utiliser lors de l'envoi. L'adresse de l'expéditeur doit être une adresse assignée à cette machine, qui peut être obtenue en utilisant QNetworkInterface, et le numéro de port doit être le numéro de port auquel la socket est liée. L'un ou l'autre de ces champs peut être laissé vide et sera rempli par le système d'exploitation avec des valeurs par défaut. Les champs destinationAddress() et destinationPort() peuvent être définis sur une adresse cible différente de celle à laquelle la socket UDP est actuellement associée.
Habituellement, lors de l'envoi d'un datagramme en réponse à un datagramme reçu précédemment, le champ destinationAddress() est remplacé par le champ senderAddress() du datagramme entrant, et il en va de même pour les numéros de port. Pour faciliter ce processus commun, QNetworkDatagram fournit la fonction makeReply().
La fonction hopCount() contient, pour un datagramme reçu, la limite du nombre de sauts restants pour le paquet. Lors de l'envoi, elle contient la limite du nombre de sauts à fixer. La plupart des protocoles laissent cette valeur par défaut et laissent le système d'exploitation décider de la meilleure valeur à utiliser. La multidiffusion sur IPv4 utilise souvent ce champ pour indiquer la portée du groupe de multidiffusion (locale, locale à une organisation ou globale).
La fonction interfaceIndex() contient l'index de l'interface du système d'exploitation qui a reçu le paquet. Cette valeur est la même que celle qui peut être définie sur une propriété QHostAddress::scopeId() et correspond à la propriété QNetworkInterface::index(). Lors de l'envoi de paquets à des adresses globales, il n'est pas nécessaire de définir l'index de l'interface car le système d'exploitation choisira la bonne interface en utilisant la table de routage du système. Cette propriété est importante lors de l'envoi de datagrammes vers des destinations locales, qu'il s'agisse d'unicast ou de multicast.
Prise en charge des fonctionnalités
Certaines fonctionnalités de QNetworkDatagram ne sont pas prises en charge par tous les systèmes d'exploitation. Seuls l'adresse et les ports de l'hôte distant (expéditeur dans les paquets reçus et destination pour les paquets sortants) sont pris en charge dans tous les systèmes. Sur la plupart des systèmes d'exploitation, les autres fonctionnalités ne sont prises en charge que pour IPv6. Les logiciels doivent vérifier au moment de l'exécution si le reste peut être déterminé pour les adresses IPv4.
La prise en charge actuelle des fonctionnalités est la suivante :
| Système d'exploitation | Adresse locale | Nombre de sauts | Index d'interface |
|---|---|---|---|
| FreeBSD | Pris en charge | Pris en charge | Uniquement pour IPv6 |
| Linux | Pris en charge | Pris en charge | Pris en charge |
| OS X | Supporté | Pris en charge | Uniquement pour IPv6 |
| Autres Unix supportant la RFC 3542 | Uniquement pour IPv6 | Uniquement pour IPv6 | Uniquement pour IPv6 |
| Windows (bureau) | Pris en charge | Pris en charge | Supporté |
| Windows RT | Non pris en charge | Non pris en charge | Non pris en charge |
Voir aussi QUdpSocket et QNetworkInterface.
Documentation sur les fonctions membres
QNetworkDatagram::QNetworkDatagram()
Crée un objet QNetworkDatagram sans données utiles et avec une adresse de destination non définie.
La charge utile peut être modifiée en utilisant setData() et l'adresse de destination peut être définie avec setDestination().
Si l'adresse de destination n'est pas définie, QUdpSocket::writeDatagram() tentera d'envoyer le datagramme à la dernière adresse associée à l'aide de QUdpSocket::connectToHost().
QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)
Crée un objet QNetworkDatagram et définit data comme données utiles, ainsi que destinationAddress et port comme adresse de destination du datagramme.
QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)
Crée une copie du datagramme other, y compris la charge utile et les métadonnées.
Pour créer un datagramme adapté à l'envoi d'une réponse, utilisez QNetworkDatagram::makeReply() ;
void QNetworkDatagram::clear()
Efface les données de la charge utile et les métadonnées de l'objet QNetworkDatagram, en les ramenant à leurs valeurs par défaut.
QByteArray QNetworkDatagram::data() const
Renvoie la charge utile de données de ce datagramme. Pour un datagramme reçu du réseau, il contient la charge utile du datagramme. Pour un datagramme sortant, il s'agit du datagramme à envoyer.
Notez que les datagrammes peuvent être transmis sans données, de sorte que l'adresse QByteArray renvoyée peut être vide.
Voir aussi setData().
QHostAddress QNetworkDatagram::destinationAddress() const
Renvoie l'adresse de destination associée à ce datagramme. Pour un datagramme reçu du réseau, il s'agit de l'adresse à laquelle le nœud homologue a envoyé le datagramme, qui peut être soit une adresse locale de cette machine, soit une adresse de multidiffusion ou de diffusion. Pour un datagramme sortant, il s'agit de l'adresse à laquelle le datagramme doit être envoyé.
Si aucune adresse de destination n'a été définie pour ce datagramme, l'objet renvoyé indiquera true à QHostAddress::isNull().
Voir également senderAddress(), destinationPort() et setDestination().
int QNetworkDatagram::destinationPort() const
Renvoie le numéro de port de la destination associée à ce datagramme. Pour un datagramme reçu du réseau, il s'agit du numéro de port local auquel le nœud homologue a envoyé le datagramme. Pour un datagramme sortant, il s'agit du port du nœud homologue vers lequel le datagramme doit être envoyé.
Si aucune adresse de destination n'a été associée à ce datagramme, cette fonction renvoie -1.
Voir aussi destinationAddress(), senderPort() et setDestination().
int QNetworkDatagram::hopLimit() const
Renvoie la limite du nombre de sauts associée à ce datagramme. La limite du nombre de sauts est le nombre de nœuds autorisés à transmettre le paquet IP avant qu'il n'expire et qu'une erreur ne soit renvoyée à l'expéditeur du datagramme. En IPv4, cette valeur est généralement connue sous le nom de "time to live" (TTL).
Si ce datagramme a été reçu du réseau, il s'agit du nombre de sauts restants après réception, qui a été décrémenté de 1 par chaque nœud qui a transmis le paquet. Une valeur de -1 indique que le nombre limite de sauts n'a pas été obtenu.
S'il s'agit d'un datagramme sortant, il s'agit de la valeur à définir dans l'en-tête IP lors de l'envoi. La valeur -1 indique que le système d'exploitation doit choisir la valeur.
Voir également setHopLimit().
uint QNetworkDatagram::interfaceIndex() const
Renvoie l'indice d'interface auquel ce datagramme est associé. L'index d'interface est un nombre positif qui identifie de manière unique l'interface réseau dans le système d'exploitation. Ce nombre correspond à la valeur renvoyée par QNetworkInterface::index() pour l'interface.
Si ce datagramme a été reçu du réseau, il s'agit de l'index de l'interface à partir de laquelle le paquet a été reçu. S'il s'agit d'un datagramme sortant, il s'agit de l'index de l'interface sur laquelle le datagramme doit être envoyé.
La valeur 0 indique que l'index de l'interface est inconnu.
Voir également setInterfaceIndex().
bool QNetworkDatagram::isNull() const
Retourne vrai si l'objet QNetworkDatagram est nul. Cette fonction est l'inverse de isValid().
bool QNetworkDatagram::isValid() const
Retourne vrai si cet objet QNetworkDatagram est valide. Un objet QNetworkDatagram valide contient au moins une adresse d'expéditeur ou de destinataire. Les datagrammes valides peuvent contenir des charges utiles vides.
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&
Crée un nouveau QNetworkDatagram représentant une réponse à ce datagramme entrant et attribue la valeur payload aux données utiles. Cette fonction est un moyen très pratique de répondre à un datagramme en le renvoyant à l'expéditeur d'origine.
Exemple :
void Server::readPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket->receiveDatagram(); QByteArray replyData = processThePayload(datagram.data()); udpSocket->writeDatagram(datagram.makeReply(replyData)); } }
Cette fonction est particulièrement pratique car elle copiera automatiquement les paramètres de ce datagramme dans le nouveau datagramme, le cas échéant :
- l'adresse et le port de l'expéditeur de ce datagramme sont copiés dans l'adresse et le port de destination du nouveau datagramme ;
- l'index d'interface de ce datagramme, s'il existe, est copié sur l'index d'interface du nouveau datagramme ;
- l'adresse et le port de destination de ce datagramme sont copiés sur l'adresse et le port de l'expéditeur du nouveau datagramme uniquement s'il s'agit d'une adresse IPv6 globale (non multidiffusion) ;
- la limite du nombre de sauts sur le nouveau datagramme est réinitialisée à la valeur par défaut (-1) ;
Si QNetworkDatagram est modifié dans une future version de Qt XML pour porter d'autres métadonnées, cette fonction copiera ces métadonnées comme il convient.
L'adresse de destination de ce datagramme n'est pas copiée s'il s'agit d'une adresse IPv4, car il n'est pas possible de distinguer une adresse de diffusion IPv4 d'une adresse IPv4 normale sans effectuer une recherche exhaustive de toutes les adresses attribuées à cette machine. Toute tentative d'envoi d'un datagramme dont l'adresse de l'expéditeur est égale à l'adresse de diffusion est susceptible d'échouer. Cependant, cela ne devrait pas affecter la communication, car les interfaces réseau avec plusieurs adresses IPv4 sont peu courantes, de sorte que l'adresse sélectionnée par le système d'exploitation sera probablement celle que l'homologue comprendra.
Note : Cette fonction est fournie avec des surcharges de qualificateurs de référence rvalue et lvalue, il est donc conseillé de s'assurer que cet objet est rvalue, si possible, avant d'appeler makeReply, afin de mieux utiliser la sémantique de déplacement. Pour ce faire, l'exemple ci-dessus devrait utiliser :
udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));
QHostAddress QNetworkDatagram::senderAddress() const
Renvoie l'adresse de l'expéditeur associée à ce datagramme. Pour un datagramme reçu du réseau, il s'agit de l'adresse du nœud pair qui a envoyé le datagramme. Pour un datagramme sortant, il s'agit de l'adresse locale à utiliser lors de l'envoi.
Si aucune adresse d'expéditeur n'a été définie pour ce datagramme, l'objet renvoyé indiquera true à QHostAddress::isNull().
Voir également destinationAddress(), senderPort() et setSender().
int QNetworkDatagram::senderPort() const
Renvoie le numéro de port de l'expéditeur associé à ce datagramme. Pour un datagramme reçu du réseau, il s'agit du numéro de port à partir duquel le nœud homologue a envoyé le datagramme. Pour un datagramme sortant, il s'agit du port local à partir duquel le datagramme doit être envoyé.
Si aucune adresse d'expéditeur n'a été associée à ce datagramme, cette fonction renvoie -1.
Voir aussi senderAddress(), destinationPort() et setSender().
void QNetworkDatagram::setData(const QByteArray &data)
Définit la charge utile de données de ce datagramme à data. Il n'est généralement pas nécessaire d'appeler cette fonction sur les datagrammes reçus. Pour les datagrammes sortants, cette fonction définit les données à envoyer sur le réseau.
Étant donné que les datagrammes peuvent être vides, un QByteArray vide est une valeur valide pour data.
Voir aussi data().
void QNetworkDatagram::setDestination(const QHostAddress &address, quint16 port)
Définit l'adresse de destination associée à ce datagramme comme étant l'adresse address et le numéro de port port. L'adresse de destination et les numéros de port sont généralement définis par QUdpSocket lors de la réception, il n'est donc pas nécessaire d'appeler cette fonction sur un datagramme reçu.
Pour les datagrammes sortants, cette fonction peut être utilisée pour définir l'adresse à laquelle le datagramme doit être envoyé. Il peut s'agir de l'adresse unicast utilisée pour communiquer avec l'homologue ou d'une adresse broadcast ou multicast à envoyer à un groupe de périphériques.
Voir aussi QUdpSocket::writeDatagram(), destinationAddress(), destinationPort() et setSender().
void QNetworkDatagram::setHopLimit(int count)
Définit la limite du nombre de sauts associée à ce datagramme à count. La limite du nombre de sauts est le nombre de nœuds autorisés à transmettre le paquet IP avant qu'il n'expire et qu'une erreur ne soit renvoyée à l'expéditeur du datagramme. En IPv4, cette valeur est généralement connue sous le nom de "time to live" (TTL).
Il n'est généralement pas nécessaire d'appeler cette fonction sur les datagrammes reçus du réseau.
S'il s'agit d'un paquet sortant, il s'agit de la valeur à définir dans l'en-tête IP lors de l'envoi. La valeur est comprise entre 1 et 255. Cette fonction accepte également la valeur -1 pour indiquer que le système d'exploitation doit choisir la valeur.
Voir aussi hopLimit().
void QNetworkDatagram::setInterfaceIndex(uint index)
Définit l'index d'interface auquel ce datagramme est associé à index. L'index d'interface est un nombre positif qui identifie de manière unique l'interface réseau dans le système d'exploitation. Ce nombre correspond à la valeur renvoyée par QNetworkInterface::index() pour l'interface.
Il n'est généralement pas nécessaire d'appeler cette fonction pour les datagrammes reçus du réseau.
S'il s'agit d'un paquet sortant, il s'agit de l'index de l'interface sur laquelle le datagramme doit être envoyé. La valeur 0 indique que le système d'exploitation doit choisir l'interface en fonction d'autres facteurs.
Notez que l'index de l'interface peut également être défini avec QHostAddress::setScopeId() pour les adresses de destination IPv6, puis avec setDestination(). Si l'ID d'étendue défini dans l'adresse de destination et index sont différents et qu'aucun n'est égal à zéro, l'interface sur laquelle le système d'exploitation enverra le datagramme n'est pas définie.
Voir également interfaceIndex().
void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)
Définit l'adresse de l'expéditeur associée à ce datagramme comme étant l'adresse address et le numéro de port port. L'adresse de l'expéditeur et les numéros de port sont généralement définis par QUdpSocket lors de la réception, il n'est donc pas nécessaire d'appeler cette fonction sur un datagramme reçu.
Pour les datagrammes sortants, cette fonction peut être utilisée pour définir l'adresse que le datagramme doit porter. L'adresse address doit généralement être l'une des adresses locales attribuées à cette machine, qui peut être obtenue en utilisant QNetworkInterface. Si elle n'est pas définie, le système d'exploitation choisira l'adresse la plus appropriée pour la destination en question.
Le numéro de port port doit être le numéro de port associé à la socket, s'il y en a une. La valeur 0 peut être utilisée pour indiquer que le système d'exploitation doit choisir le numéro de port.
Voir aussi QUdpSocket::writeDatagram(), senderAddress(), senderPort() et setDestination().
[noexcept] void QNetworkDatagram::swap(QNetworkDatagram &other)
Échange ce datagramme avec other. Cette opération est très rapide et n'échoue jamais.
QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)
Copie le datagramme other, y compris la charge utile et les métadonnées.
Pour créer un datagramme adapté à l'envoi d'une réponse, utilisez 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.