有没有办法在将地址作为参数传递给boost::array时将其递增?
准确地说,我提供了一个buffer -> 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));
}
}我知道这个示例只适用于一个调用(然后我必须将已读的传输字节保存在另一个变量中),但我只是想澄清我的观点。
有人能帮我吗?我怎么做?
发布于 2012-02-18 19:56:02
您可以将async_read与包含数据大小的标题一起使用。然后使用读取大小再次调用async_read。我只是在其他帖子上给出了一些例子,就是take a look。
发布于 2012-03-01 21:14:29
从技术上讲,boost::array有c_array()成员函数,它允许您访问底层的c数组。因此您可以编写类似于asio::buffer(buffer.c_array() + bytesTransferred, buffer.size() - bytesTransferred))的代码
但是使用asio::streambuf会更安全。
https://stackoverflow.com/questions/9331932
复制相似问题