Повышение iostreams: Как создать буферизованный (для чтения) поток TCP? - PullRequest
17 голосов
/ 10 февраля 2012

Поэтому мой главный вопрос здесь заключается в том, как реализовать структуру поверх asio tcp :: socket или tcp :: iostream, которая бы реализовала некоторый фильтр с возможностью поиска по входу enter image description here

с буфером до 1kb?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Я думаю, что-то вроде «перейти к концу потока» не будет возможно для TCP-соединения. Должен ли такой вызов (см. Следующий код) подождать (заблокировать) соединение? И как он должен хранить ответ, когда он достигает размера буфера (например, 1 КБ)?

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

Так что будет сложно (/ невозможно?) Реализовать поток TCP с возможностью поиска вообще. Даже если у вас неограниченный буфер (не только 1 Кб).

Должна быть возможность реализовать что-то вроде поиска ввода для определенных протоколов, таких как HTTP (S), когда установлен заголовок Content-Length. Но и в этом случае буфер фиксированного размера в 1 КБ не будет работать, если вы не используете заголовок диапазона HTTP / 1.1.

Возможно, это поможет: Кристофер М. Колхофф (автор Boost asio) реализовал Urdl (помечен как «Prealpha» в SourceForge), где он смоделировал HTTP-соединение как поток. Я думаю, что метод read_some может быть вам интересен: https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426

0 голосов
/ 02 марта 2012

Я не знаком с этим конкретным буст-модулем.Но, если вы ищете способ создать буфер, который действует как своего рода хранилище, я бы создал другой поток для управления им.Поток мог LIFO входящий поток, обрабатывая запросы фильтра и управление буфером.Хранение его в отдельном потоке будет означать, что он будет внимателен к входящим пакетам до того, как закончится системный буфер, так что вам не нужно беспокоиться о том, чтобы ничего не пропустить.Может быть создана очередь сообщений для посредничества между потоками.

Тем не менее, в конце концов, вероятно, проще всего будет обратиться к заранее написанной библиотеке, чтобы справиться с ней и сэкономить немного времени.Проверьте этот пост .

...