Sur cette page

QUdpSocket Class

La classe QUdpSocket fournit un socket UDP. En savoir plus...

En-tête : #include <QUdpSocket>
CMake : find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake : QT += network
Hérite de : QAbstractSocket

Remarque : toutes les fonctions de cette classe sont réentrantes.

Fonctions publiques

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)

Description détaillée

Le protocole UDP (User Datagram Protocol) est un protocole léger, non fiable, orienté datagrammes et sans connexion. Il peut être utilisé lorsque la fiabilité n’est pas un critère essentiel. QUdpSocket est une sous-classe de QAbstractSocket qui vous permet d’envoyer et de recevoir des datagrammes UDP.

La manière la plus courante d’utiliser cette classe consiste à se lier à une adresse et à un port à l’aide de ` bind()`, puis à appeler ` writeDatagram()` et ` readDatagram()` / ` receiveDatagram()` pour transférer des données. Si vous souhaitez utiliser les fonctions standard de ` QIODevice ` telles que ` read()`, ` readLine()`, ` write()`, etc., vous devez d’abord connecter le socket directement à un pair en appelant ` connectToHost()`.

Le socket émet le signal bytesWritten() chaque fois qu’un datagramme est écrit sur le réseau. Si vous souhaitez simplement envoyer des datagrammes, vous n’avez pas besoin d’appeler bind().

Le signal ` readyRead()` est émis chaque fois que des datagrammes arrivent. Dans ce cas, la fonction ` hasPendingDatagrams()` renvoie ` true`. Appelez ` pendingDatagramSize()` pour obtenir la taille du premier datagramme en attente, puis ` readDatagram()` ou ` receiveDatagram()` pour le lire.

Remarque : un datagramme entrant doit être lu lorsque vous recevez le signal readyRead(), sinon ce signal ne sera pas émis pour le datagramme suivant.

Exemple :

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 prend également en charge la multidiffusion UDP. Utilisez les fonctions joinMulticastGroup() et leaveMulticastGroup() pour gérer l’appartenance à un groupe, et QAbstractSocket::MulticastTtlOption ainsi que QAbstractSocket::MulticastLoopbackOption pour définir les options TTL et de socket de bouclage. Utilisez la fonction setMulticastInterface() pour contrôler l’interface de sortie des datagrammes multidiffusés, et multicastInterface() pour l’interroger.

Avec QUdpSocket, vous pouvez également établir une connexion virtuelle vers un serveur UDP à l’aide de ` connectToHost()` ( ), puis utiliser ` read()` ( ) et ` write()` ( ) pour échanger des datagrammes sans spécifier le destinataire de chaque datagramme.

Les exemples « Broadcast Sender », « Broadcast Receiver », « Multicast Sender » et « Multicast Receiver » illustrent l'utilisation de QUdpSocket dans des applications.

Voir également QTcpSocket et QNetworkDatagram.

Documentation sur les fonctions membres

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

Crée un objet QUdpSocket.

parent est transmis au constructeur QObject.

Voir aussi socketType().

[virtual noexcept] QUdpSocket::~QUdpSocket()

Détruit le socket et ferme la connexion si nécessaire.

Voir aussi close().

bool QUdpSocket::hasPendingDatagrams() const

Renvoie « true » si au moins un datagramme est en attente de lecture ; sinon, renvoie « false ».

Voir également pendingDatagramSize() et readDatagram().

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

Rejoint le groupe de multidiffusion spécifié par groupAddress sur l'interface par défaut choisie par le système d'exploitation. Le socket doit être en état « BoundState », sinon une erreur se produit.

Notez que si vous tentez de rejoindre un groupe IPv4, votre socket ne doit pas être liée via IPv6 (ou en mode dual, à l'aide de ` QHostAddress::Any`). Vous devez utiliser ` QHostAddress::AnyIPv4 ` à la place.

Cette fonction renvoie ` true ` en cas de succès ; sinon, elle renvoie ` false ` et définit l'erreur de socket en conséquence.

Remarque : la participation à des groupes de multidiffusion IPv6 sans sélection d’interface n’est pas prise en charge par tous les systèmes d’exploitation. Envisagez d’utiliser la surcharge où l’interface est spécifiée.

Voir également leaveMulticastGroup().

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

Rejoint l'adresse de groupe de multidiffusion groupAddress sur l'interface iface.

Il s'agit d'une fonction surchargée.

Voir également leaveMulticastGroup().

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

Quitte le groupe de multidiffusion spécifié par groupAddress sur l'interface par défaut choisie par le système d'exploitation. Le socket doit être en état « BoundState », sinon une erreur se produit.

Cette fonction renvoie ` true ` en cas de succès ; dans le cas contraire, elle renvoie ` false ` et définit l'erreur de socket en conséquence.

Remarque : cette fonction doit être appelée avec les mêmes arguments que ceux passés à joinMulticastGroup().

Voir aussi joinMulticastGroup().

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

Quitte le groupe de multidiffusion spécifié par ` groupAddress ` sur l'interface ` iface`.

Remarque : cette fonction doit être appelée avec les mêmes arguments que ceux passés à joinMulticastGroup().

Il s'agit d'une fonction surchargée.

Voir également joinMulticastGroup().

QNetworkInterface QUdpSocket::multicastInterface() const

Renvoie l'interface de sortie pour les datagrammes multicast. Cela correspond à l’option de socket IP_MULTICAST_IF pour les sockets IPv4 et à l’option de socket IPV6_MULTICAST_IF pour les sockets IPv6. Si aucune interface n’a été préalablement définie, cette fonction renvoie une valeur invalide QNetworkInterface. La socket doit être dans l’état BoundState, sinon une valeur invalide QNetworkInterface est renvoyée.

Voir également setMulticastInterface().

qint64 QUdpSocket::pendingDatagramSize() const

Renvoie la taille du premier datagramme UDP en attente. S'il n'y a pas de datagramme disponible, cette fonction renvoie -1.

Voir également hasPendingDatagrams() et readDatagram().

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

Reçoit un datagramme dont la taille ne dépasse pas maxSize octets et le stocke dans data. L'adresse hôte et le port de l'expéditeur sont stockés dans *address et *port (à moins que les pointeurs ne soient nullptr).

Renvoie la taille du datagramme en cas de réussite ; sinon, renvoie -1.

Si maxSize est trop petit, le reste du datagramme sera perdu. Pour éviter toute perte de données, appelez pendingDatagramSize() afin de déterminer la taille du datagramme en attente avant de tenter de le lire. Si maxSize est égal à 0, le datagramme sera ignoré.

Voir également writeDatagram(), hasPendingDatagrams() et pendingDatagramSize().

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

Reçoit un datagramme dont la taille ne dépasse pas maxSize octets et le renvoie dans l'objet QNetworkDatagram, accompagné de l'adresse hôte et du port de l'expéditeur. Si possible, cette fonction tentera également de déterminer l'adresse de destination du datagramme, son port et le nombre de sauts au moment de la réception.

En cas d’échec, elle renvoie un ` QNetworkDatagram ` indiquant ` not valid`.

Si ` maxSize ` est trop petit, le reste du datagramme sera perdu. Si ` maxSize ` est égal à 0, le datagramme sera ignoré. Si ` maxSize ` est égal à -1 (valeur par défaut), cette fonction tentera de lire l’intégralité du datagramme.

Voir également writeDatagram(), hasPendingDatagrams() et pendingDatagramSize().

void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)

Définit l'interface de sortie pour les datagrammes de multidiffusion sur l'interface iface. Cela correspond à l'option de socket IP_MULTICAST_IF pour les sockets IPv4 et à l'option de socket IPV6_MULTICAST_IF pour les sockets IPv6. La socket doit être dans l'état « BoundState » ; sinon, cette fonction ne fait rien.

Voir également multicastInterface(), joinMulticastGroup() et leaveMulticastGroup().

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

Envoie le datagramme à l'data, d'une taille de size, vers l'adresse hôte address sur le port port. Renvoie le nombre d'octets envoyés en cas de succès ; sinon, renvoie -1.

Les datagrammes sont toujours écrits en un seul bloc. La taille maximale d’un datagramme dépend fortement de la plate-forme, mais peut être aussi faible que 8 192 octets. Si le datagramme est trop volumineux, cette fonction renvoie -1 et la fonction error() renvoie l’erreur DatagramTooLargeError.

L’envoi de datagrammes de plus de 512 octets est en général déconseillé, car même s’ils sont envoyés avec succès, ils risquent d’être fragmentés par la couche IP avant d’arriver à leur destination finale.

Avertissement : l'appel de cette fonction sur un socket UDP connecté peut entraîner une erreur et empêcher l'envoi du paquet. Si vous utilisez un socket connecté, utilisez write() pour envoyer des datagrammes.

Voir également ` readDatagram()` et ` write()`.

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

Envoie le datagramme datagram à l'adresse hôte et aux numéros de port indiqués dans datagram, en utilisant l'interface réseau et les limites de nombre de sauts également définies dans ce fichier. Si l'adresse de destination et les numéros de port ne sont pas définis, cette fonction enverra le datagramme à l'adresse transmise à la fonction connectToHost().

Si l’adresse de destination est une adresse IPv6 avec une liste d’ scope id s non vide mais différente de l’index d’interface indiqué dans datagram, le choix de l’interface sur laquelle le système d’exploitation effectuera l’envoi n’est pas défini.

La fonction renvoie le nombre d’octets envoyés en cas de réussite, ou -1 en cas d’erreur.

Avertissement : l’appel de cette fonction sur une socket UDP connectée peut entraîner une erreur et empêcher l’envoi de tout paquet. Si vous utilisez une socket connectée, utilisez write() pour envoyer des datagrammes.

Il s’agit d’une fonction surchargée.

Voir également QNetworkDatagram::setDestination(), QNetworkDatagram::setHopLimit() et QNetworkDatagram::setInterfaceIndex().

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

Envoie le datagramme datagram à l'adresse hôte host sur le port port.

La fonction renvoie le nombre d’octets envoyés en cas de succès, ou -1 en cas d’erreur.

Il s'agit d'une fonction surchargée.

© 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.