有什么方法可以在将地址作为参数传递时将地址增加到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传输的字节保存在另一个变量中)但我只是想明确一点。
所以任何人都有一些帮助,我怎么能这样做?
答案 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
会更安全。