En esta página

QNetworkDatagram Class

La clase QNetworkDatagram proporciona los datos y metadatos de un datagrama UDP. Más...

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

Nota: Todas las funciones de esta clase son reentrantes.

Funciones Públicas

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)

Descripción Detallada

QNetworkDatagram se puede utilizar con la clase QUdpSocket para representar la información completa contenida en un datagrama UDP (User Datagram Protocol). QNetworkDatagram encapsula la siguiente información de un datagrama:

  • los datos de la carga útil
  • la dirección y el número de puerto del remitente
  • la dirección y el número de puerto de destino
  • el límite de saltos restantes (en IPv4, este campo suele denominarse "tiempo de vida" - TTL);
  • el índice de la interfaz de red en la que se recibió el datagrama o en la que se va a enviar.

QUdpSocket intentará ajustarse en la medida de lo posible a un comportamiento común en todos los sistemas operativos, pero no todos los metadatos anteriores pueden obtenerse en algunos sistemas operativos. Los metadatos que no se puedan establecer en el datagrama al enviarlo con QUdpSocket::writeDatagram() se descartarán silenciosamente.

Tras la recepción, las propiedades senderAddress() y senderPort() contienen la dirección y el puerto del peer que envió el datagrama, mientras que destinationAddress() y destinationPort() contienen el destino que contenía el datagrama. Normalmente se trata de una dirección local de la máquina actual, pero también puede ser una dirección de difusión IPv4 (como "255.255.255.255") o una dirección de multidifusión IPv4 o IPv6. Las aplicaciones pueden encontrar útil determinar si el datagrama fue enviado específicamente a esta máquina mediante una dirección unicast o si fue enviado a múltiples destinos.

Al enviar, los campos senderAddress() y senderPort() deben contener la dirección local que se utilizará al enviar. La dirección del remitente debe ser una dirección asignada a esta máquina, que puede obtenerse utilizando QNetworkInterface, y el número de puerto debe ser el número de puerto al que está enlazado el socket. Cualquiera de los dos campos puede dejarse sin configurar y serán rellenados por el sistema operativo con valores por defecto. Los campos destinationAddress() y destinationPort() pueden establecerse a una dirección de destino diferente de aquella a la que está asociado actualmente el socket UDP.

Normalmente, cuando se envía un datagrama en respuesta a un datagrama recibido previamente, se configurará el destinationAddress() para que sea el senderAddress() del datagrama entrante y de forma similar para los números de puerto. Para facilitar este proceso común, QNetworkDatagram proporciona la función makeReply().

La función hopCount() contiene, para un datagrama recibido, el límite de saltos restante para el paquete. Cuando se envía, contiene el límite de conteo de saltos a establecer. La mayoría de los protocolos dejarán este valor por defecto y dejarán que el sistema operativo decida el mejor valor a utilizar. La multidifusión sobre IPv4 a menudo utiliza este campo para indicar el alcance del grupo de multidifusión (link-local, local a una organización o global).

La función interfaceIndex() contiene el índice de la interfaz del sistema operativo que ha recibido el paquete. Este valor es el mismo que puede establecerse en una propiedad QHostAddress::scopeId() y coincide con la propiedad QNetworkInterface::index(). Cuando se envían paquetes a direcciones globales, no es necesario establecer el índice de la interfaz ya que el sistema operativo elegirá la correcta utilizando la tabla de enrutamiento del sistema. Esta propiedad es importante cuando se envían datagramas a destinos link-local, ya sean unicast o multicast.

Soporte de funciones

Algunas características de QNetworkDatagram no están soportadas en todos los sistemas operativos. Sólo la dirección y los puertos del host remoto (remitente en los paquetes recibidos y destino para los paquetes salientes) están soportados en todos los sistemas. En la mayoría de los sistemas operativos, las demás características sólo se admiten para IPv6. El software debe comprobar en tiempo de ejecución si el resto puede determinarse para direcciones IPv4.

El soporte actual de características es el siguiente:

Sistema operativoDirección localRecuento de saltosÍndice de interfaz
FreeBSDSoportadoSoportadoSólo para IPv6
LinuxSoportadoCompatibleCompatible
OS XCompatibleCompatibleSólo para IPv6
Otros Unix compatibles con RFC 3542Sólo para IPv6Sólo para IPv6Sólo para IPv6
Windows (escritorio)Compatible conCompatibleCompatible
Windows RTNo compatibleNo compatibleNo compatible

Véase también QUdpSocket y QNetworkInterface.

Documentación de las funciones miembro

QNetworkDatagram::QNetworkDatagram()

Crea un objeto QNetworkDatagram sin datos de carga útil y dirección de destino indefinida.

La carga útil puede modificarse utilizando setData() y la dirección de destino puede establecerse con setDestination().

Si la dirección de destino se deja sin definir, QUdpSocket::writeDatagram() intentará enviar el datagrama a la dirección asociada por última vez, utilizando QUdpSocket::connectToHost().

QNetworkDatagram::QNetworkDatagram(const QByteArray &data, const QHostAddress &destinationAddress = QHostAddress(), quint16 port = 0)

Crea un objeto QNetworkDatagram y establece data como datos de carga útil, junto con destinationAddress y port como dirección de destino del datagrama.

QNetworkDatagram::QNetworkDatagram(const QNetworkDatagram &other)

Crea una copia del datagrama other, incluyendo la carga útil y los metadatos.

Para crear un datagrama adecuado para enviarlo en una respuesta, utilice QNetworkDatagram::makeReply();

void QNetworkDatagram::clear()

Borra los datos de la carga útil y los metadatos de este objeto QNetworkDatagram, restableciéndolos a sus valores predeterminados.

QByteArray QNetworkDatagram::data() const

Devuelve la carga útil de datos de este datagrama. Para un datagrama recibido de la red, contiene la carga útil del datagrama. Para un datagrama saliente, es el datagrama a enviar.

Tenga en cuenta que los datagramas pueden transmitirse sin datos, por lo que la dirección QByteArray devuelta puede estar vacía.

Véase también setData().

QHostAddress QNetworkDatagram::destinationAddress() const

Devuelve la dirección de destino asociada a este datagrama. Para un datagrama recibido de la red, es la dirección a la que el nodo par envió el datagrama, que puede ser una dirección local de esta máquina o una dirección multicast o broadcast. Para un datagrama saliente, es la dirección a la que debe enviarse el datagrama.

Si no se ha establecido ninguna dirección de destino en este datagrama, el objeto devuelto informará true a QHostAddress::isNull().

Véase también senderAddress(), destinationPort(), y setDestination().

int QNetworkDatagram::destinationPort() const

Devuelve el número de puerto del destino asociado a este datagrama. Para un datagrama recibido de la red, es el número de puerto local al que el nodo par envió el datagrama. Para un datagrama saliente, es el puerto del nodo par al que debe enviarse el datagrama.

Si no se ha asociado ninguna dirección de destino a este datagrama, esta función devuelve -1.

Véase también destinationAddress(), senderPort() y setDestination().

int QNetworkDatagram::hopLimit() const

Devuelve el límite de saltos asociado a este datagrama. El límite de saltos es el número de nodos que pueden reenviar el paquete IP antes de que caduque y se envíe un error al remitente del datagrama. En IPv4, este valor suele conocerse como "tiempo de vida" (TTL).

Si este datagrama fue recibido de la red, este es el recuento de saltos restantes del datagrama después de la recepción y fue decrementado en 1 por cada nodo que reenvió el paquete. Un valor de -1 indica que no se ha obtenido el recuento de saltos límite.

Si se trata de un datagrama saliente, este es el valor que se establecerá en la cabecera IP al enviarlo. Un valor de -1 indica que el sistema operativo debe elegir el valor.

Véase también setHopLimit().

uint QNetworkDatagram::interfaceIndex() const

Devuelve el índice de interfaz al que está asociado este datagrama. El índice de interfaz es un número positivo que identifica unívocamente la interfaz de red en el sistema operativo. Este número coincide con el valor devuelto por QNetworkInterface::index() para la interfaz.

Si este datagrama se recibió de la red, este es el índice de la interfaz desde la que se recibió el paquete. Si se trata de un datagrama saliente, es el índice de la interfaz por la que debe enviarse el datagrama.

Un valor de 0 indica que el índice de la interfaz es desconocido.

Véase también setInterfaceIndex().

bool QNetworkDatagram::isNull() const

Devuelve verdadero si este objeto QNetworkDatagram es nulo. Esta función es la opuesta a isValid().

bool QNetworkDatagram::isValid() const

Devuelve true si este objeto QNetworkDatagram es válido. Un objeto QNetworkDatagram válido contiene al menos una dirección de remitente o de destinatario. Los datagramas válidos pueden contener cargas útiles vacías.

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) const &

QNetworkDatagram QNetworkDatagram::makeReply(const QByteArray &payload) &&

Crea un nuevo QNetworkDatagram que representa una respuesta a este datagrama entrante y establece los datos de carga útil en payload. Esta función es una forma muy conveniente de responder a un datagrama de vuelta al remitente original.

Ejemplo:

    void Server::readPendingDatagrams()
    {
        while (udpSocket->hasPendingDatagrams()) {
            QNetworkDatagram datagram = udpSocket->receiveDatagram();
            QByteArray replyData = processThePayload(datagram.data());
            udpSocket->writeDatagram(datagram.makeReply(replyData));
        }
    }

Esta función es especialmente conveniente ya que copiará automáticamente los parámetros de este datagrama al nuevo datagrama según corresponda:

  • la dirección y el puerto del remitente de este datagrama se copian en la dirección y el puerto de destino del nuevo datagrama;
  • el índice de interfaz de este datagrama, si existe, se copia en el índice de interfaz del nuevo datagrama;
  • la dirección de destino y el puerto de este datagrama se copian en la dirección de remitente y el puerto del nuevo datagrama sólo si la dirección es una dirección global IPv6 (no multidifusión);
  • el límite del recuento de saltos del nuevo datagrama se restablece al valor predeterminado (-1);

Si QNetworkDatagram se modifica en una futura versión de Qt para incluir más metadatos, esta función los copiará según corresponda.

La dirección de destino de este datagrama no se copia si es una dirección IPv4 porque no es posible diferenciar una dirección de difusión IPv4 de una dirección IPv4 normal sin una búsqueda exhaustiva de todas las direcciones asignadas a esta máquina. Es probable que falle el intento de enviar un datagrama con la dirección del remitente igual a la dirección de difusión. Sin embargo, esto no debería afectar a la comunicación ya que las interfaces de red con múltiples direcciones IPv4 son poco comunes, por lo que la dirección que el sistema operativo seleccionará será probablemente una que el peer entienda.

Nota: Esta función viene con sobrecargas de calificador de referencia rvalue y lvalue, por lo que es una buena idea asegurarse de que este objeto es rvalue, si es posible, antes de llamar a makeReply, para hacer un mejor uso de la semántica move. Para ello, en el ejemplo anterior se utilizaría:

    udpSocket->writeDatagram(std::move(datagram).makeReply(replyData));

QHostAddress QNetworkDatagram::senderAddress() const

Devuelve la dirección del remitente asociada a este datagrama. Para un datagrama recibido de la red, es la dirección del nodo par que envió el datagrama. Para un datagrama saliente, es la dirección local que se utilizará al enviar.

Si no se estableció ninguna dirección de remitente en este datagrama, el objeto devuelto informará true a QHostAddress::isNull().

Véase también destinationAddress(), senderPort(), y setSender().

int QNetworkDatagram::senderPort() const

Devuelve el número de puerto del remitente asociado a este datagrama. Para un datagrama recibido de la red, es el número de puerto desde el que el nodo par envió el datagrama. Para un datagrama saliente, es el puerto local desde el que debe enviarse el datagrama.

Si no se ha asociado ninguna dirección de remitente a este datagrama, esta función devuelve -1.

Véase también senderAddress(), destinationPort() y setSender().

void QNetworkDatagram::setData(const QByteArray &data)

Establece la carga útil de datos de este datagrama en data. Normalmente no es necesario llamar a esta función en los datagramas recibidos. Para los datagramas salientes, esta función establece los datos que se enviarán por la red.

Dado que los datagramas pueden vaciarse, un QByteArray vacío es un valor válido para data.

Véase también data().

void QNetworkDatagram::setDestination(const QHostAddress &address, quint16 port)

Establece que la dirección de destino asociada a este datagrama sea la dirección address y el número de puerto port. La dirección de destino y los números de puerto son normalmente establecidos por QUdpSocket en la recepción, por lo que no hay necesidad de llamar a esta función en un datagrama recibido.

Para los datagramas salientes, esta función puede utilizarse para establecer la dirección a la que debe enviarse el datagrama. Puede ser la dirección unicast utilizada para comunicarse con el peer o una dirección broadcast o multicast para enviar a un grupo de dispositivos.

Véase también QUdpSocket::writeDatagram(), destinationAddress(), destinationPort() y setSender().

void QNetworkDatagram::setHopLimit(int count)

Establece el límite del recuento de saltos asociado a este datagrama en count. El límite del recuento de saltos es el número de nodos a los que se permite reenviar el paquete IP antes de que caduque y se envíe un error al remitente del datagrama. En IPv4, este valor suele conocerse como "tiempo de vida" (TTL).

Normalmente no es necesario llamar a esta función en datagramas recibidos de la red.

Si se trata de un paquete saliente, este es el valor que se establecerá en la cabecera IP al enviarlo. El rango válido para el valor es de 1 a 255. Esta función también acepta un valor de -1 para indicar que el sistema operativo debe elegir el valor.

Véase también hopLimit().

void QNetworkDatagram::setInterfaceIndex(uint index)

Establece el índice de interfaz al que está asociado este datagrama en index. El índice de interfaz es un número positivo que identifica de forma única la interfaz de red en el sistema operativo. Este número coincide con el valor devuelto por QNetworkInterface::index() para la interfaz.

Normalmente no es necesario llamar a esta función en datagramas recibidos de la red.

Si se trata de un paquete saliente, este es el índice de la interfaz por la que debe enviarse el datagrama. Un valor de 0 indica que el sistema operativo debe elegir la interfaz basándose en otros factores.

Tenga en cuenta que el índice de interfaz también se puede establecer con QHostAddress::setScopeId() para direcciones de destino IPv6 y, a continuación, con setDestination(). Si el ID de ámbito establecido en la dirección de destino y index son diferentes y ninguno de los dos es cero, no está definido por qué interfaz enviará el datagrama el sistema operativo.

Véase también interfaceIndex().

void QNetworkDatagram::setSender(const QHostAddress &address, quint16 port = 0)

Establece que la dirección del remitente asociada a este datagrama sea la dirección address y el número de puerto port. La dirección del remitente y los números de puerto son normalmente establecidos por QUdpSocket en la recepción, por lo que no hay necesidad de llamar a esta función en un datagrama recibido.

Para los datagramas salientes, esta función puede utilizarse para establecer la dirección que debe llevar el datagrama. La dirección address debe ser normalmente una de las direcciones locales asignadas a esta máquina, que puede obtenerse utilizando QNetworkInterface. Si no se define, el sistema operativo elegirá la dirección más apropiada para el destino en cuestión.

El número de puerto port debe ser el número de puerto asociado al socket, si existe. El valor 0 puede utilizarse para indicar que el sistema operativo debe elegir el número de puerto.

Véase también QUdpSocket::writeDatagram(), senderAddress(), senderPort() y setDestination().

[noexcept] void QNetworkDatagram::swap(QNetworkDatagram &other)

Intercambia este datagrama con other. Esta operación es muy rápida y nunca falla.

QNetworkDatagram &QNetworkDatagram::operator=(const QNetworkDatagram &other)

Copia el datagrama other, incluyendo la carga útil y los metadatos.

Para crear un datagrama adecuado para enviarlo en una respuesta, utilice 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.