Boost iostreams: Как создать буферный (для чтения) поток TCP?

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

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

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