Как вручную поместить данные в boost :: asio :: streambuf, чтобы позже прочитать их с помощью std :: istream? - PullRequest
4 голосов
/ 15 июня 2011

Я пытаюсь использовать std :: istream в качестве источника данных. Я хочу разместить пользовательских двоичных данных в потоковом буфере istream, чтобы впоследствии их можно было извлечь из istream.

Я читал о boost :: asio :: streambuf и о том, как он используется для выполнения именно того, что я хочу, но с использованием сокета в качестве источника данных вместо буфера в памяти, что я и хотел бы использовать.

Из того, что я понимаю из документации , шаги должны быть:

  1. Создать буст :: asio :: streambuf
  2. Создайте std :: istream, передавая streambuf
  3. Invoke boost :: asio :: streambuf :: prepare, чтобы получить список буферов, представляющих выходную последовательность.
  4. Как-то записать в выходную последовательность.
  5. Вызвать boost :: asio :: streambuf :: commit, чтобы переместить то, что я написал в выходной последовательности, во входную последовательность.
  6. Обычно читает из std :: istream из шага 2 с помощью std :: stream :: read.

Я не знаю, как выполнить шаг 4, поэтому я не знаю, даже если я иду в правильном направлении.

Правильно ли изображены шаги? Если да, то как обратиться к шагу 4?

Ответы [ 2 ]

6 голосов
/ 16 июня 2011

Вы можете легко отправить любой поток STD, так что вы также можете stringstream. Вы можете записать двоичные данные в ваш поток строк (фактически это просто байтовый массив).

Несколько образцов:

boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream.write(&binarydata_buf, sizeof(binarydata_buf));
// or use stream operators: request_stream << "xxx" << yyy;

// Send the request.
boost::asio::write(socket, request);

Если у вас уже есть полностью заполненный istream (в этом примере в качестве пустышки используется std :: cin):

boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << std::cin.rdbuf() << std::flush;

// Send the request.
boost::asio::write(socket, request);

Способы заполнения потока - например, ostream::write или Повышенная сериализация binary_archive

Конечно, есть много способов снять шкуру с кошки, поэтому обязательно продумайте другие варианты, прежде чем слепо копировать это.

См. Как отправить ostream через буст-сокеты в C ++?

0 голосов
/ 15 июня 2011

Почему бы просто не передать данные через сокет в потоковый буфер? Если вы можете связать std :: istream с asio :: streambuf, который прослушивает определенный сокет, просто используйте тот же сокет с boost :: asio :: write для отправки ему данных.

Нет большого штрафа за использование реальных сокетов внутри процесса, вместо того, чтобы пытаться смоделировать его путем доступа к базовым структурам данных.

...