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 |
- Lista de todos los miembros, incluidos los heredados
- QNetworkDatagram es parte de la API de programación de redes.
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 operativo | Dirección local | Recuento de saltos | Índice de interfaz |
|---|---|---|---|
| FreeBSD | Soportado | Soportado | Sólo para IPv6 |
| Linux | Soportado | Compatible | Compatible |
| OS X | Compatible | Compatible | Sólo para IPv6 |
| Otros Unix compatibles con RFC 3542 | Sólo para IPv6 | Sólo para IPv6 | Sólo para IPv6 |
| Windows (escritorio) | Compatible con | Compatible | Compatible |
| Windows RT | No compatible | No compatible | No 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.