2011-05-08 14 views
6

estoy leyendo desde un boost::asio::ip::udp::socket así:impulso dinámicamente tamaño asio :: :: búfer

using boost::asio::ip::udp; 

// ... 

char recv_buf[128]; 
udp::endpoint sender_endpoint; 
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint); 

Ahora, esto funciona perfectamente bien, pero la cantidad máxima de caracteres que soy capaz de recibir es ahora 127. Sin embargo, tengo un problema porque necesito aceptar algunos datos cuya longitud puede variar mucho (y no es de una longitud bien definida con encabezados prefijados, por ejemplo). Una solución a esto sería un buffer de expansión dinámica, como un vector. ¿Es posible crear un boost::asio::buffer que se expanda dinámicamente para aceptar cantidades de entrada infinitas (teóricas) y almacenarlas en un contenedor?

Respuesta

5

El tamaño del datagrama UDP no varía mucho: nunca será mayor que 65535, dejando espacio para 65,527 bytes de datos después del encabezado de 8 bytes.

+1

+1 ¡Tienes toda la razón! Sin embargo, me interesaría un 'boost :: asio :: buffer' dinámico, no porque 64KiB sea tan grande, pero un búfer dinámico a menudo parece mucho más apropiado y para su reutilización en TCP. – orlp

+0

@nightcracker con TCP, asio llama al controlador de lectura cuando el búfer está lleno, por lo que puede vaciarlo y volver a leerlo. – Cubbi

0

No parece haber ninguna disposición para el tamaño dinámico. Y tiene sentido que no lo haya. Piense en lo que tendría que suceder:

  • Un datagrama UDP única sólo puede ser recibido una vez, y al mismo tiempo, por lo tanto:
  • el buffer dado a la llamada al sistema de bajo nivel debe ser lo suficientemente grande para que el El mensaje más grande válido, entonces,
  • para que sea eficiente, el buffer debe ser asignado por adelantado por la persona que llama.

Así que no tiene sentido que exista un búfer de tamaño dinámico disponible. Como señala Cubbi, los datagramas UDP tienen un tamaño máximo más bien pequeño, así que simplemente haga que su memoria intermedia sea tan grande como el mensaje válido más grande en su sistema y termine con eso.

+3

'boost :: asio :: buffer' es un búfer de entrada/salida ASyncronous general, y no solo se usa para UDP. – orlp

+0

Claro. Y, en general, no tiene sentido tener uno dinámico. Ni para su aplicación ni para TCP ni ningún otro protocolo que eventualmente llame a las rutinas C de bajo nivel para que hagan su trabajo, porque solo conducirá a una copia ineficiente de memoria, lo cual es anatema en C++ y en Boost. –

1

Si usa buffers más pequeños, puede encadenarlos fácilmente mediante los conceptos de * BufferSequences. Por ejemplo, puede pasar un MutableBufferSequence para aceptar datos de una llamada de lectura (2) o pasar un ConstBufferSequence para obtener una lista de almacenamientos intermedios que va a escribir (2). Dicho esto, tiendo a recomendar el uso de un solo buffer en cada dirección porque tiende a simplificar el código (aunque eso no siempre es posible).

Cuestiones relacionadas