QNetworkDatagram Class
La classe QNetworkDatagram fournit les données et les métadonnées d'un datagramme UDP. En savoir plus...
| 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.
Remarque : 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'intégralité des informations contenues dans un datagramme UDP (User Datagram Protocol). QNetworkDatagram encapsule les informations suivantes d'un datagramme :
- les données utiles ;
- l'adresse et le numéro de port de l'expéditeur ;
- l'adresse de destination et le numéro de port ;
- le nombre maximal de sauts restants (sous 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 vers laquelle il doit être envoyé.
QUdpSocket On s’efforcera d’adopter un comportement aussi uniforme que possible sur tous les systèmes d’exploitation, mais certaines métadonnées ci-dessus ne peuvent pas être obtenues sur tous les 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 ignorées sans avertissement.
À la réception, les propriétés ` senderAddress()` et ` senderPort()` contiennent l’adresse et le port du pair ayant envoyé le datagramme, tandis que ` destinationAddress()` et ` destinationPort()` contiennent la destination indiquée 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 un adressage unicast ou s’il a été envoyé à plusieurs destinations.
Lors de l’envoi, les champs ` senderAddress()` et ` senderPort()` doivent contenir l’adresse locale à utiliser lors de l’envoi. L’adresse de l’expéditeur doit être une adresse attribuée à cette machine, qui peut être obtenue à l’aide de ` QNetworkInterface`, et le numéro de port doit correspondre au numéro de port auquel le socket est lié. Chacun de ces champs peut être laissé vide ; le système d’exploitation le remplira alors avec des valeurs par défaut. Les champs destinationAddress() et destinationPort() peuvent être définis sur une adresse de destination différente de celle à laquelle la socket UDP est actuellement associée.
En général, lors de l’envoi d’un datagramme en réponse à un datagramme précédemment reçu, on définit l’adresse source ( destinationAddress()) comme étant l’adresse de destination ( senderAddress()) du datagramme entrant, et il en va de même pour les numéros de port. Pour faciliter ce processus courant, QNetworkDatagram fournit la fonction makeReply().
La fonction hopCount() contient, pour un datagramme reçu, le nombre maximal de sauts restants pour le paquet. Lors de l’envoi, elle contient le nombre maximal de sauts à définir. La plupart des protocoles laissent cette valeur à son niveau par défaut et laissent le système d’exploitation déterminer la valeur optimale à utiliser. La multidiffusion sur IPv4 utilise souvent ce champ pour indiquer la portée du groupe de multidiffusion (locale au niveau de la liaison, 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 identique à celle pouvant être définie dans la propriété ` QHostAddress::scopeId()` et correspond à la propriété ` QNetworkInterface::index()`. Lors de l’envoi de paquets vers des adresses globales, il n’est pas nécessaire de définir l’index de l’interface, car le système d’exploitation choisira le bon à l’aide de la table de routage du système. Cette propriété est importante lors de l’envoi de datagrammes vers des destinations « link-local », qu’il s’agisse de diffusion unidirectionnelle ou multidiffusion.
Prise en charge des fonctionnalités
Certaines fonctionnalités de QNetworkDatagram ne sont pas prises en charge par tous les systèmes d’exploitation. Seules l’adresse et les ports de l’hôte distant (expéditeur pour les paquets reçus et destination pour les paquets sortants) sont pris en charge par tous les systèmes. Sur la plupart des systèmes d’exploitation, les autres fonctionnalités ne sont prises en charge que pour IPv6. Le logiciel doit vérifier lors de l’exécution si les autres éléments peuvent être déterminés pour les adresses IPv4.
La prise en charge actuelle des fonctionnalités est la suivante :
| Système d’exploitation | Adresse locale | Nombre de sauts | Indice d'interface |
|---|---|---|---|
| FreeBSD | Prise en charge | Prise en charge | Uniquement pour IPv6 |
| Linux | Pris en charge | Pris en charge | Pris en charge |
| OS X | Pris en charge | Prise en charge | Uniquement pour IPv6 |
| Autres systèmes Unix prenant en charge la norme RFC 3542 | Uniquement pour IPv6 | Uniquement pour IPv6 | Uniquement pour IPv6 |
| Windows (ordinateur de bureau) | Pris en charge | Prise en charge | Prise en charge |
| Windows RT | Non pris en charge | Non pris en charge | Non pris en charge |
Voir également QUdpSocket et QNetworkInterface.
Documentation sur les fonctions membres
QNetworkDatagram::QNetworkDatagram()
Crée un objet `QNetworkDatagram` sans données de charge utile et avec une adresse de destination non définie.
La charge utile peut être modifiée à l'aide de la fonction ` setData()` et l'adresse de destination peut être définie à l'aide de la fonction ` setDestination()`.
Si l'adresse de destination n'est pas définie, la fonction ` QUdpSocket::writeDatagram()` tentera d'envoyer le datagramme à la dernière adresse associée à l'objet, à l'aide de la fonction ` 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 adresses 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 pouvant être envoyé en réponse, utilisez QNetworkDatagram::makeReply();
void QNetworkDatagram::clear()
Efface les données de charge utile et les métadonnées de cet objet « QNetworkDatagram », en les réinitialisant à leurs valeurs par défaut.
QByteArray QNetworkDatagram::data() const
Renvoie la charge utile de ce datagramme. Pour un datagramme reçu du réseau, elle contient la charge utile de ce datagramme. Pour un datagramme sortant, il s'agit du datagramme à envoyer.
Notez que les datagrammes peuvent être transmis sans données ; la fonction ` QByteArray ` renvoyée peut donc être vide.
Voir également 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 ; il peut s'agir soit d'une adresse locale de cette machine, soit d'une adresse de multidiffusion ou de diffusion générale. 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 sur ce datagramme, l’objet renvoyé indiquera « true » à la fonction ` 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 vers lequel 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'était associée à ce datagramme, cette fonction renvoie -1.
Voir également 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 correspond au nombre de nœuds autorisés à transférer le paquet IP avant que celui-ci n'expire et qu'une erreur ne soit renvoyée à l'expéditeur du datagramme. En IPv4, cette valeur est généralement appelée « time to live » (TTL).
Si ce datagramme a été reçu du réseau, il s'agit du nombre de sauts restants du datagramme après réception ; ce nombre a été décrémenté de 1 par chaque nœud ayant acheminé le paquet. Une valeur de -1 indique que le nombre maximal de sauts n'a pas pu être 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. Une valeur de -1 indique que le système d’exploitation doit choisir la valeur.
Voir également setHopLimit().
uint QNetworkDatagram::interfaceIndex() const
Renvoie l'index de l'interface à laquelle ce datagramme est associé. L'index d'interface est un nombre positif qui identifie de manière unique l'interface réseau au sein du système d'exploitation. Ce nombre correspond à la valeur renvoyée par la fonction QNetworkInterface::index() pour cette interface.
Si ce datagramme a été reçu du réseau, il s'agit de l'index de l'interface par laquelle le paquet a été reçu. S'il s'agit d'un datagramme sortant, il s'agit de l'index de l'interface par laquelle le datagramme doit être envoyé.
Une valeur égale à 0 indique que l’index de l’interface est inconnu.
Voir également la fonction ` setInterfaceIndex()`.
bool QNetworkDatagram::isNull() const
Renvoie « true » si cet objet « QNetworkDatagram » est nul. Cette fonction est l'opposé de « isValid() ».
bool QNetworkDatagram::isValid() const
Renvoie « true » 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) &&
QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &
Crée un nouvel objet ` QNetworkDatagram ` représentant une réponse à ce datagramme entrant et définit les données de charge utile comme suit : ` payload`. Cette fonction constitue un moyen très pratique de renvoyer une réponse à 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 copie automatiquement les paramètres de ce datagramme vers le nouveau datagramme, le cas échéant :
- l'adresse et le port de l'expéditeur de ce datagramme sont copiés respectivement dans l'adresse et le port de destination du nouveau datagramme ;
- l’index d’interface de ce datagramme, le cas échéant, est copié dans l’index d’interface du nouveau datagramme ;
- l'adresse de destination et le port de ce datagramme sont copiés respectivement dans l'adresse d'expéditeur et le port du nouveau datagramme uniquement si l'adresse est une adresse IPv6 globale (non multidiffusion) ;
- la limite du nombre de sauts du nouveau datagramme est réinitialisée à la valeur par défaut (-1) ;
Si l’ QNetworkDatagram est modifiée dans une future version de Qt pour transporter des métadonnées supplémentaires, cette fonction copiera ces métadonnées en conséquence.
L'adresse de destination de ce datagramme n'est pas copiée s'il s'agit d'une adresse IPv4, car il est impossible de distinguer une adresse de diffusion IPv4 d'une adresse IPv4 classique sans effectuer une recherche exhaustive de toutes les adresses attribuées à cette machine. Tenter d'envoyer un datagramme dont l'adresse d'expéditeur est égale à l'adresse de diffusion risque d'échouer. Toutefois, cela ne devrait pas affecter la communication, car les interfaces réseau disposant de plusieurs adresses IPv4 sont rares ; l'adresse choisie par le système d'exploitation sera donc probablement comprise par le correspondant.
Remarque : cette fonction dispose de surcharges pour les qualificateurs de référence rvalue et lvalue ; il est donc recommandé de s’assurer que cet objet est de type rvalue, si possible, avant d’appeler ` makeReply`, afin de tirer meilleur parti de la sémantique de déplacement. Pour ce faire, l’exemple ci-dessus utiliserait :
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 sur ce datagramme, l'objet renvoyé indiquera « true » à la fonction ` 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'était associée à ce datagramme, cette fonction renvoie -1.
Voir également senderAddress(), destinationPort() et setSender().
void QNetworkDatagram::setData(const QByteArray &data)
Définit la charge utile de ce datagramme sur 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.
Les datagrammes pouvant être vides, un QByteArray vide est une valeur valide pour data.
Voir également ` 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 le numéro de port sont généralement définis par la fonction 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 le pair, ou d’une adresse de diffusion ou de multidiffusion permettant d’envoyer le datagramme à un groupe de périphériques.
Voir également 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 correspond au nombre de nœuds autorisés à transférer le paquet IP avant que celui-ci n'expire et qu'une erreur ne soit renvoyée à l'expéditeur du datagramme. En IPv4, cette valeur est généralement appelée « 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, c'est la valeur à définir dans l'en-tête IP lors de l'envoi. La plage de valeurs valides 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 également hopLimit().
void QNetworkDatagram::setInterfaceIndex(uint index)
Définit l'index d'interface associé à ce datagramme sur index. L'index d'interface est un nombre positif qui identifie de manière unique l'interface réseau au sein du système d'exploitation. Ce nombre correspond à la valeur renvoyée par la fonction QNetworkInterface::index() pour cette interface.
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 l'index de l'interface par laquelle le datagramme doit être envoyé. Une valeur de 0 indique que le système d'exploitation doit choisir l'interface en fonction d'autres facteurs.
Notez que l’index d’interface peut également être défini à l’aide de ` QHostAddress::setScopeId()` pour les adresses de destination IPv6, puis à l’aide de ` setDestination()`. Si l’ID de portée défini dans l’adresse de destination et celui de ` index ` sont différents et qu’aucun des deux 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 la fonction 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 transporter. L’adresse address doit généralement être l’une des adresses locales attribuées à cette machine, qui peuvent être obtenues à l’aide de QNetworkInterface. Si elle n’est pas définie, le système d’exploitation choisira l’adresse la plus appropriée en fonction de la destination en question.
Le numéro de port port doit correspondre au numéro de port associé au socket, s’il en existe un. La valeur 0 peut être utilisée pour indiquer que le système d’exploitation doit choisir le numéro de port.
Voir également QUdpSocket::writeDatagram(), senderAddress(), senderPort() et setDestination().
[noexcept] void QNetworkDatagram::swap(QNetworkDatagram &other)
Permet d'échanger ce datagramme contre celui de other. Cette opération est très rapide et ne rate 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.