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
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. –
¿Por curiosidad has echado un vistazo a esto? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore
@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. –