在异步读取调用时递增boost阵列地址

时间:2012-02-17 16:28:26

标签: arrays sockets boost buffer boost-asio

有什么方法可以在将地址作为参数传递时将地址增加到boost::array

准确地说,我提供了一个缓冲区 - &gt; boost::array<char, 4096> buffer

这个缓冲区我传递给socket::async_read_some调用以填充它。现在当我的async_read_some完成时,缓冲区不一定是满的(我可以用bytes_transferred查看)。现在,如果发生这种情况,我想再次调用async_read_some来进一步填充缓冲区。

现在,如果我像平常一样传递缓冲区,它只会覆盖其中的内容。但是我希望函数在第一次调用之后填充缓冲区。不幸的是,我不能只传递增加的地址buffer+bytes_transferred,这可以使用普通的char*缓冲区。

这里是我想要做的一些(简化的)示例代码 - 请假设所有内容都已初始化并且io_service正在运行。

void myClass::startRead()
{
    mySocket.async_read_some(boost::asio::buffer(buffer,4096)),
         boost::bind(&myClass::handle_read, shared_from_this(),
               boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void myClass::handle_read(const boost::system::error_code& err ,size_t bytesTransferred)
{
    if ( bytes_transferred < 4096 )
    {
            mySocket.async_read_some(/* address of buffer + bytes_transferred */
                         boost::bind(&myClass::handle_read, shared_from_this(),
                              boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
}

我知道这个例子只适用于一个调用(然后我必须将alread传输的字节保存在另一个变量中)但我只是想明确一点。

所以任何人都有一些帮助,我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以将async_read与包含数据大小的标头一起使用。然后再次使用读取大小调用async_read。我只是在其他帖子上给出一些例子,只是take a look

答案 1 :(得分:0)

从技术上讲,boost :: array具有c_array()成员函数,允许您访问底层的c-array。所以你可以写一些像asio::buffer(buffer.c_array() + bytesTransferred, buffer.size() - bytesTransferred))

这样的东西

但使用asio::streambuf会更安全。