使用boost :: asio丢弃数据

时间:2011-08-23 20:44:20

标签: c++ boost boost-asio

我在异步模式下使用boost :: asio,我想跳过/丢弃/丢弃通过TCP发送给我的消息。我想这样做,因为我已经阅读了该消息的标题,我知道这对我没有意义。消息可能很大,所以我宁愿不为它分配空间,最好不要将它转移到用户空间。

我看到了boost :: asio :: null_buffers,但它似乎不适用于此处(请参阅https://svn.boost.org/trac/boost/ticket/3627)。

2 个答案:

答案 0 :(得分:7)

据我所知,BSD套接字接口没有为您提供此功能。你总是要读入一个缓冲区。现在,为了不分配大量缓冲区,您可以做的是在循环中读入较小的缓冲区。像这样:

void skip_impl(tcp::socket& s, int n, boost::function<void(error_code const&)> h
    , char* buf, error_code const& ec, std::size_t bytes_transferred)
{
    assert(bytes_transferred <= n);
    n -= bytes_transferred;
    if (ec || n == 0) {
        delete[] buf;
        h(ec);
        return;
    }

    s.async_read_some(boost::asio::buffer(temp, std::min(4096, n))
        , boost::bind(&skip_impl, boost::ref(s), n, h, temp, _1, _2));
}

void async_skip_bytes(tcp::socket& s, int n, boost::function<void(error_code const&)> h)
{
    char* temp = new char[4096];
    s.async_read_some(boost::asio::buffer(temp, std::min(4096, n))
        , boost::bind(&skip_impl, boost::ref(s), n, h, temp, _1, _2));
}

这还没有通过编译器传递,因此可能存在愚蠢的拼写错误,但它应该说明这一点。

答案 1 :(得分:0)

Boost的Asio是一个我还没有用过的图书馆。所以我不知道是否有任何带有Sink接口的东西都可以插入。但是如果是这样的话,那么null_sink可以很好地适应你的情况......?

http://www.boost.org/doc/libs/1_46_1/libs/iostreams/doc/classes/null.html

(它只会丢弃数据,所以你仍然处于用户空间。如果有其他方法,我会感到惊讶,但如果可以的话会很酷。)