我从boost asio的流中读取时遇到问题。第一次调用async_read_until会给我传输460个字节(我用wirehark进行了检查)。之后,我将使用用streambuf指针初始化的istream与istreambuf_iterator一起使用std :: copy_n。效果很好,并且std :: copy_n的目标将请求保留到分隔符序列之内。

下一次调用async_read_until之后发生奇怪的事情。似乎没有从streambuf中读取最后一个字符,因此下一个处理程序调用给了我一个比请求实际大小多一个字节的字节。

将istream与asio的streambuf一起使用是否有任何限制?

最佳答案

除了注释外,这里还有一个演示程序,演示了与asio::streambuf交互的两种方式。

一种方式是将streambuf包装到I / O流中,另一种方式是通过使用prepare / commit和data / consume直接访问。

#include <boost/asio.hpp>
#include <iostream>
#include <string>
#include <algorithm>
#include <memory>

namespace asio = boost::asio;

void direct_insert(asio::streambuf& sb, std::string const& data)
{
    auto size = data.size();
    auto buffer = sb.prepare(size);
    std::copy(begin(data), end(data), asio::buffer_cast<char*>(buffer));
    sb.commit(size);
}

void stream_insert(asio::streambuf& sb, std::string const& data)
{
    std::ostream strm(std::addressof(sb));
    strm << data;
}

std::string extract_istream(asio::streambuf& sb)
{
    std::istream is(std::addressof(sb));
    std::string line;
    std::getline(is, line);
    return line;
}

std::string extract_direct(asio::streambuf& sb)
{
    auto buffer = sb.data();
    auto first = asio::buffer_cast<const char*>(buffer);
    auto bufsiz = asio::buffer_size(buffer);
    auto last = first + bufsiz;

    auto nlpos = std::find(first, last, '\n');

    auto result = std::string(first, nlpos);

    auto to_consume = std::min(std::size_t(std::distance(first, nlpos) + 1), bufsiz);
    sb.consume(to_consume);
    return result;
}

int main()
{
    asio::streambuf buf;
    direct_insert(buf, "The cat sat on the mat\n");
    stream_insert(buf, "The cat sat on the mat\n");

    auto s1 = extract_direct(buf);
    auto s2 = extract_istream(buf);

    std::cout << s1 << "\n" << s2 << "\n";
}

关于c++ - 从boost asio streambuf读取将字节保留在缓冲区中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46885612/

10-13 08:10