2012-02-10 6 views
17

Quindi la mia domanda principale è come implementare una struttura su TCP ASIO :: presa o tcp :: iostream che implementare some kind of input-seekable filter enter image description hereBoost iostreams: come creare un flusso TCP bufferizzato (per la lettura)?

con tampone per dire 1kb?

+6

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. –

+0

Per curiosità hai dato un'occhiata a questo? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore

+0

@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. –

risposta

0

Non ho dimestichezza con questo particolare modulo boost. Ma se si cerca un modo per creare un buffer che agisca come un repository di sorta, vorrei creare un altro thread per gestirlo. Il thread potrebbe LIFO il flusso in entrata, gestendo le richieste di filtro e la gestione del buffer. Mantenerlo su un thread separato significherebbe che sarebbe attento ai pacchetti in arrivo prima che il buffer di sistema si esaurisse, quindi non devi preoccuparti di perdere qualcosa. Una coda di messaggi potrebbe essere creata per mediare tra i thread.

Detto questo, alla fine probabilmente sarebbe più semplice cercare una libbra già scritta per gestirlo e risparmiare un po 'di tempo. Controlla this post.

1

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

Problemi correlati