En esta página

QUdpSocket Class

La clase QUdpSocket proporciona un socket UDP. Más...

Cabecera: #include <QUdpSocket>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
Hereda: QAbstractSocket

Nota: Todas las funciones de esta clase son reentrantes.

Funciones Públicas

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)

Descripción Detallada

UDP (User Datagram Protocol) es un protocolo ligero, poco fiable, orientado a datagramas y sin conexión. Puede utilizarse cuando la fiabilidad no es importante. QUdpSocket es una subclase de QAbstractSocket que permite enviar y recibir datagramas UDP.

La forma más común de usar esta clase es enlazarse a una dirección y puerto usando bind(), luego llamar a writeDatagram() y readDatagram() / receiveDatagram() para transferir datos. Si quieres usar las funciones estándar de QIODevice read (), readLine(), write(), etc., primero debes conectar el socket directamente a un peer llamando a connectToHost().

El socket emite la señal bytesWritten() cada vez que se escribe un datagrama en la red. Si sólo quieres enviar datagramas, no necesitas llamar a bind().

La señal readyRead() se emite cada vez que llegan datagramas. En ese caso, hasPendingDatagrams() devuelve true. Llame a pendingDatagramSize() para obtener el tamaño del primer datagrama pendiente, y a readDatagram() o receiveDatagram() para leerlo.

Nota: Un datagrama entrante debe leerse cuando se recibe la señal readyRead(), de lo contrario esta señal no se emitirá para el siguiente datagrama.

Ejemplo:

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 también soporta UDP multicast. Utilice joinMulticastGroup() y leaveMulticastGroup() para controlar la pertenencia a un grupo, y QAbstractSocket::MulticastTtlOption y QAbstractSocket::MulticastLoopbackOption para establecer las opciones TTL y loopback del socket. Utilice setMulticastInterface() para controlar la interfaz de salida de los datagramas multicast, y multicastInterface() para consultarla.

Con QUdpSocket, también puede establecer una conexión virtual con un servidor UDP utilizando connectToHost() y luego utilizar read() y write() para intercambiar datagramas sin especificar el receptor de cada datagrama.

Los ejemplos Emisor Broadcast, Receptor Broadcast, Emisor Multicast y Receptor Multicast ilustran cómo utilizar QUdpSocket en aplicaciones.

Vea también QTcpSocket y QNetworkDatagram.

Documentación de las funciones de los miembros

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

Crea un objeto QUdpSocket.

parent se pasa al constructor QObject.

Véase también socketType().

[virtual noexcept] QUdpSocket::~QUdpSocket()

Destruye el socket, cerrando la conexión si es necesario.

Véase también close().

bool QUdpSocket::hasPendingDatagrams() const

Devuelve true si hay al menos un datagrama en espera de ser leído; en caso contrario devuelve false.

Véase también pendingDatagramSize() y readDatagram().

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

Se une al grupo multicast especificado por groupAddress en la interfaz por defecto elegida por el sistema operativo. El socket debe estar en BoundState, de lo contrario se produce un error.

Ten en cuenta que si estás intentando unirte a un grupo IPv4, tu socket no debe estar enlazado usando IPv6 (o en modo dual, usando QHostAddress::Any). Debe usar QHostAddress::AnyIPv4 en su lugar.

Esta función devuelve true si tiene éxito; en caso contrario, devuelve false y establece el error de socket en consecuencia.

Nota: Unirse a grupos multicast IPv6 sin una selección de interfaz no está soportado en todos los sistemas operativos. Considere utilizar la sobrecarga en la que se especifica la interfaz.

Véase también leaveMulticastGroup().

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

Se une a la dirección de grupo multicast groupAddress en la interfaz iface.

Esta es una función sobrecargada.

Véase también leaveMulticastGroup().

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

Deja el grupo multicast especificado por groupAddress en la interfaz por defecto elegida por el sistema operativo. El socket debe estar en BoundState, de lo contrario se produce un error.

Esta función devuelve true si tiene éxito; en caso contrario devuelve false y establece el error del socket en consecuencia.

Nota: Esta función debe llamarse con los mismos argumentos que se pasaron a joinMulticastGroup().

Véase también joinMulticastGroup().

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

Abandona el grupo de multidifusión especificado por groupAddress en la interfaz iface.

Nota: Esta función debe llamarse con los mismos argumentos que se pasaron a joinMulticastGroup().

Se trata de una función sobrecargada.

Véase también joinMulticastGroup().

QNetworkInterface QUdpSocket::multicastInterface() const

Devuelve la interfaz de salida para datagramas multicast. Esto corresponde a la opción de socket IP_MULTICAST_IF para sockets IPv4 y a la opción de socket IPV6_MULTICAST_IF para sockets IPv6. Si no se ha establecido previamente ninguna interfaz, esta función devuelve un QNetworkInterface inválido. El socket debe estar en BoundState, de lo contrario se devuelve un QNetworkInterface inválido.

Véase también setMulticastInterface().

qint64 QUdpSocket::pendingDatagramSize() const

Devuelve el tamaño del primer datagrama UDP pendiente. Si no hay datagrama disponible, esta función devuelve -1.

Véase también hasPendingDatagrams() y readDatagram().

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

Recibe un datagrama no mayor que maxSize bytes y lo almacena en data. La dirección del host y el puerto del remitente se almacenan en *address y *port (a menos que los punteros sean nullptr).

Devuelve el tamaño del datagrama en caso de éxito; en caso contrario devuelve -1.

Si maxSize es demasiado pequeño, el resto del datagrama se perderá. Para evitar la pérdida de datos, llame a pendingDatagramSize() para determinar el tamaño del datagrama pendiente antes de intentar leerlo. Si maxSize es 0, el datagrama se descartará.

Véase también writeDatagram(), hasPendingDatagrams() y pendingDatagramSize().

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

Recibe un datagrama no mayor que maxSize bytes y lo devuelve en el objeto QNetworkDatagram, junto con la dirección de host y el puerto del remitente. Si es posible, esta función también intentará determinar la dirección de destino del datagrama, el puerto y el número de saltos en el momento de la recepción.

En caso de fallo, devuelve un QNetworkDatagram que informa de not valid.

Si maxSize es demasiado pequeño, el resto del datagrama se perderá. Si maxSize es 0, el datagrama se descartará. Si maxSize es -1 (por defecto), esta función intentará leer el datagrama completo.

Véase también writeDatagram(), hasPendingDatagrams() y pendingDatagramSize().

void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)

Establece la interfaz de salida para datagramas multicast en la interfaz iface. Esto corresponde a la opción de socket IP_MULTICAST_IF para sockets IPv4 y a la opción de socket IPV6_MULTICAST_IF para sockets IPv6. El socket debe estar en BoundState, de lo contrario esta función no hace nada.

Véase también multicastInterface(), joinMulticastGroup(), y leaveMulticastGroup().

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

Envía el datagrama data de tamaño size a la dirección de host address en el puerto port. En caso de éxito, devuelve el número de bytes enviados; en caso contrario, devuelve -1.

Los datagramas se escriben siempre como un bloque. El tamaño máximo de un datagrama depende en gran medida de la plataforma, pero puede ser de hasta 8192 bytes. Si el datagrama es demasiado grande, esta función devolverá -1 y error() devolverá DatagramTooLargeError.

El envío de datagramas de más de 512 bytes es en general desaconsejable, ya que incluso si se envían con éxito, es probable que sean fragmentados por la capa IP antes de llegar a su destino final.

Advertencia: Llamar a esta función en un socket UDP conectado puede provocar un error y que no se envíe ningún paquete. Si está utilizando un socket conectado, utilice write() para enviar datagramas.

Véase también readDatagram() y write().

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

Envía el datagrama datagram a la dirección de host y los números de puerto contenidos en datagram, utilizando la interfaz de red y los límites de recuento de saltos también establecidos allí. Si la dirección de destino y los números de puerto no están configurados, esta función enviará a la dirección que se pasó a connectToHost().

Si la dirección de destino es IPv6 con un scope id no vacío pero difiere del índice de interfaz en datagram, es indefinido qué interfaz elegirá el sistema operativo para enviar.

La función devuelve el número de bytes enviados si tuvo éxito o -1 si encontró un error.

Advertencia: Llamar a esta función en un socket UDP conectado puede provocar un error y que no se envíe ningún paquete. Si está utilizando un socket conectado, utilice write() para enviar datagramas.

Esta es una función sobrecargada.

Ver también QNetworkDatagram::setDestination(), QNetworkDatagram::setHopLimit(), y QNetworkDatagram::setInterfaceIndex().

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

Envía el datagrama datagram a la dirección de host host y al puerto port.

La función devuelve el número de bytes enviados si tuvo éxito o -1 si encontró un error.

Se trata de una función sobrecargada.

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