2011-12-01 22 views
5

Necesito enviar y recibir datos muy grandes usando udp. Desafortunadamente udp proporciona 8192 bytes por diagrama, por lo que es necesario dividir los datos en piezas más pequeñas. Estoy usando Qt y QUdpSocket. Hay un QByteArray con una longitud de 921600 que quiero enviar al cliente. Deseo enviar 8192 bytes cada vez.Enviar datos grandes en el socket UDP

¿Cuál es la manera más rápida de dividir un QByteArray?

+1

Tengo un problema similar. Sin embargo, tengo dudas de que si divido los datos y envío piezas, ¿podría reunir todas las piezas del otro lado y recuperar el conjunto de bytes original? ¿Debo poner una numeración en cada datagrama, etc.? –

Respuesta

3

Puede utilizar el método QByteArray.mid(int start, int len) (see documentation here) para obtener un QByteArray de longitud len a partir de start.

Simplemente haga len el tamaño de datagrama y empezar con 0*len, 1*len, 2*len, ... hasta que todo se envía.

5

Nunca debe necesitar dividir explícitamente los datos, simplemente páselos 8 KB a la vez. Normalmente, las funciones que escriben datos en un socket (incluido QUdpSocket::writeDatagram) aceptan un puntero al primer byte y un conteo de bytes, por lo que puede proporcionar un puntero al arreglo.

Tenga en cuenta que el envío de datagramas de 8 KB es bastante agresivo; muy probablemente serán fragmented en la capa IP, lo que puede afectar negativamente la velocidad y la confiabilidad de la entrega.

Investigue el concepto de "ruta MTU" y trate de usarlo para los envíos, puede ser más rápido aunque resulte en más datagramas.

4

En realidad, el campo de longitud en un encabezado UDP es de 16 bits, por lo que un datagrama UDP puede ser de hasta ~ 65k (menos el tamaño del encabezado).

Sin embargo, como se señaló desenrollar, lo más probable es que se fragmente en el camino para adaptarse a la MTU más pequeña en la ruta al destino.

8192 bytes es el tamaño de búfer de recepción predeterminado para los sistemas operativos Windows. El MTU es likely 1500 bytes si está utilizando Ethernet. Cualquier datagrama UDP más grande que ese será fragmentado. Si su datagrama encuentra un dispositivo a lo largo de la ruta con una MTU aún más pequeña, se fragmentará una vez más.

Cuestiones relacionadas