2012-02-10 19 views
17

Así que mi principal pregunta aquí es cómo implementar una estructura en la parte superior de TCP asio :: socket TCP o :: iostream que implementaría some kind of input-seekable filter enter image description hereBoost iostreams: ¿Cómo crear una secuencia TCP tamponada (para leer)?

con tampón hasta decir 1kb?

+6

Un problema es que es difícil usar transmisiones en sockets asíncronos. Por ejemplo, lee una cadena de la secuencia hasta que no haya más en el búfer. Pero, ¿cómo puede saber usted (o la secuencia) si realmente es el final de la cadena? El resto puede venir en otro paquete, y no hay forma de saber cuándo, o incluso si, será entregado. –

+0

¿Por curiosidad has echado un vistazo a esto? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore

+0

@JoachimPileborg: es extremadamente fácil de saber, hasta llegar al final de la secuencia o error en el socket. El resto es lógica empresarial que depende en gran medida del protocolo de alto nivel en uso. Dicho esto, se necesita buffering, pero tener C++ iostream para eso es braindead. Libevent proporciona una bonita API de almacenamiento intermedio de propósito general por ese motivo. –

Respuesta

0

No estoy familiarizado con este módulo de impulso en particular. Pero, si buscas una manera de crear un búfer que actúe como un tipo de depósito, crearía otro hilo para administrarlo. El hilo podría LIFO la secuencia entrante, manejando las solicitudes de filtro y la administración del buffer. Mantenerlo en un hilo separado significaría que estaría atento a los paquetes entrantes antes de que se agote el buffer del sistema, por lo que no tiene que preocuparse de perderse nada. Se podría crear una cola de mensajes para mediar entre hilos.

Dicho esto, al final probablemente sería más fácil buscar en una biblioteca previamente escrita para manejarlo y ahorrarse un poco de tiempo. Consulte this post.

1

Creo que algo como "ir al final de la secuencia" no será posible para una conexión TCP. ¿Debería una llamada como esta (ver el siguiente código) esperar (bloquear) para que se cierre la conexión? ¿Y cómo debe almacenar la respuesta cuando alcanza el tamaño del búfer (por ejemplo, 1Kb)?

s.seekg (0, ios::end); 

Entonces, ¿será difícil (o imposible?) Implementar una secuencia TCP buscable en general. Incluso si tiene un buffer ilimitado (no solo 1Kb).

Debería ser posible implementar algo como input-seekable para protocolos específicos como HTTP (S) cuando se establece el encabezado Content-Length. Pero también en este escenario, un búfer de tamaño fijo de 1 KB no funcionará a menos que utilice el encabezado de rango HTTP/1.1.

Tal vez esto sirva: Christopher M. Kohlhoff (autor de Boost asio) implementó Urdl (marcado como 'PreAlpha' en SourceForge) donde se modela la conexión HTTP como istream. Creo que el método read_some podría ser interesante para usted: https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426

Cuestiones relacionadas