【问题标题】:How get position of socket stream while reading读取时如何获取套接字流的位置
【发布时间】:2018-05-02 14:54:38
【问题描述】:

在使用async_read_some之类的boost功能时,是否可以找到流套接字的偏移量或位置?

例如,当程序在套接字会话中读取大量 json 文本时,我在 handle_read 中使用下一个代码,并且当我像这样读取数据时我想知道流的确切位置:

socket.async_read_some(
    boost::asio::buffer(data, max_length),
    boost::bind(&Session::handle_read, this, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
 );
 //socket.get_offset() or socket.get_position()

在文档中我找不到任何合适的解决方案。

最大缓冲区大小为 65536 字节,但 socket 获取的 json 文本更大。

我无法在正确的位置正确附加缓冲区块,因为异步在某种随机播放结果中执行此操作,但我需要以正确的方式执行此操作。

【问题讨论】:

  • 流的位置是什么意思?您可能想获取新收到的数据实际大小吗?
  • 我不想知道读取数据的实际大小。当您通过套接字发送大大小的字符串并以异步方式读取它时,您不知道读取流数据的确切位置。当您想通过使用异步读取来附加数据时,您没有得到正确的文件,您将获得数据的随机文本。因为异步读取是在某种随机处理中完成的。
  • 如果我的理解正确,查看boost::asio::error::eof 会有所帮助。

标签: c++ boost asio


【解决方案1】:

如果要获取接收到的数据的实际大小,可以在第二个参数的回调函数(Session::handle_read)中获取其值。

要读取大流,您可以检查处理程序内的boost::asio::error::eof 错误代码

    if (!err)
    {
        // Continue reading remaining data until EOF.
    }
    else if (err != boost::asio::error::eof)
    {
        std::cout << "Error: " << err << "\n";
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多