首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异步读取调用时递增升压阵列地址

在异步读取调用时递增升压阵列地址
EN

Stack Overflow用户
提问于 2012-02-18 00:28:26
回答 2查看 253关注 0票数 1

有没有办法在将地址作为参数传递给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正在运行。

代码语言:javascript
复制
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));
    }
}

我知道这个示例只适用于一个调用(然后我必须将已读的传输字节保存在另一个变量中),但我只是想澄清我的观点。

有人能帮我吗?我怎么做?

EN

回答 2

Stack Overflow用户

发布于 2012-02-18 19:56:02

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

票数 0
EN

Stack Overflow用户

发布于 2012-03-01 21:14:29

从技术上讲,boost::array有c_array()成员函数,它允许您访问底层的c数组。因此您可以编写类似于asio::buffer(buffer.c_array() + bytesTransferred, buffer.size() - bytesTransferred))的代码

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9331932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档