Penso che qualcosa come "andare alla fine del flusso" non sarà possibile per una connessione TCP. Se una chiamata come questa (vedere il codice seguente) aspetta (blocco) per la chiusura della connessione? E come dovrebbe memorizzare la risposta quando raggiunge la dimensione del buffer (ad esempio 1Kb)?
s.seekg (0, ios::end);
Quindi sarà difficile (/ impossibile?) Implementare un flusso TCP ricercabile in generale. Anche se hai un buffer illimitato (non solo 1Kb).
Dovrebbe essere possibile implementare qualcosa come input-seekable per protocolli specifici come HTTP (S) quando è impostata l'intestazione Content-Length. Ma anche in questo scenario un buffer di dimensioni fisse di 1Kb non funzionerà se non si utilizza l'intestazione Range HTTP/1.1.
Forse aiuta: Christopher M. Kohlhoff (autore di Boost ASIO) implementato Urdl (contrassegnato come 'PreAlpha' su SourceForge), dove ha modellato la connessione HTTP come un istream. Penso che il metodo read_some potrebbe essere interessante per te: https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426
fonte
2012-03-05 10:57:12
Un problema è che è difficile utilizzare i flussi su socket asincroni. Ad esempio, si legge una stringa dallo stream finché non c'è più nel buffer. Ma come puoi sapere tu (o il flusso) se è davvero la fine della stringa? Il resto potrebbe venire in un altro pacchetto, e non c'è modo di sapere quando, o effettivamente se, sarà consegnato. –
Per curiosità hai dato un'occhiata a questo? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore
@JoachimPileborg: È estremamente facile sapere - fino a quando non raggiungi la fine del flusso o l'errore sul socket. Il resto è una logica aziendale che dipende in larga misura dal protocollo di alto livello in uso. Detto questo, è necessario il buffering, ma avere l'iostream di C++ è quello di Braindead. Libevent fornisce una buona API buffer generica per questo motivo. –