Мой код выглядит следующим образом:
boost::asio::streambuf b1;
boost::asio::async_read_until(upstream_socket_, b1, '@',
boost::bind(&bridge::handle_upstream_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
void handle_upstream1_read(const boost::system::error_code& error,
const size_t& bytes_transferred)
{
if (!error)
{
async_write(downstream_socket_,
b2,
boost::bind(&bridge::handle_downstream_write,
shared_from_this(),
boost::asio::placeholders::error));
}
else
close();
}
Согласно документации async_read_until, http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/async_read_until/overload1.html, После успешного выполнения операции async_read_until streambuf может содержать дополнительные данные за пределами разделителя. Приложение обычно оставляет эти данные в streambuf для проверки последующей операцией async_read_until.
Я знаю, что streambuf может содержать дополнительные данные за пределами разделителя, но в моем случае он будет записывать эти дополнительные данные (данные за пределами char'@') в downstream_socket_ внутри операции async_write? Или будет ли функция async_write достаточно умной, чтобы не записывать эти дополнительные данные до тех пор, пока в следующий раз не будет вызвана функция handle_upstream1_read?
Согласно подходам в документации, данные в streambuf сначала сохраняются в istream ( std::istream response_stream(&streambuf); ), а затем помещаются в строку с помощью функции std::getline().
Мне действительно нужно сначала сохранить streambuf в istream, а затем преобразовать его в строку, а затем преобразовать обратно в массив символов (чтобы я мог отправить массив символов в downstream_socket_ ) вместо того, чтобы просто использовать async_write для записи данных ( до, но не включая разделитель '@' ) до downstream_socket_ ?
Я предпочитаю второй подход, так как мне не нужно делать несколько преобразований данных. Однако кажется, что что-то не так, когда я попробовал второй подход.
Мой идеальный случай таков:
- upstream_socket_ получил xxxx@yyyy с помощью async_read_until
- xxxx@ записывается в downstream_socket_
- upstream_socket_ получил zzzz@kkkk с помощью async_read_until
- yyyyzzzz@ записывается в downstream_socket_
Похоже, что операция async_write по-прежнему записывает данные за разделителем в downstream_socket_. (но я не уверен на 100% в этом)
Я ценю, если кто-нибудь может оказать небольшую помощь!