繁体   English   中英

boost :: asio :: placeholders :: bytes_transferred的含义是什么?

[英]What's the meaning of boost::asio::placeholders::bytes_transferred

async_read_until()boost::asio::placeholders::bytes_transferred是什么意思? 在回调函数中,它返回的值小于streambuf.size() 在回调之前, streambuf很清楚。 总而言之,... bytes_transferred不是通过套接字的实际字节数,而是更少。 我是否误解了所有这些,或者是什么?

编辑:我从套接字读取以下协议:

Y43,72,0,,91009802000000603=0000000000000000000

"Y43," - 是标题。
"Y" - 是消息类型。
"43" - 要读取的其他字节数
"," - 分隔符。 标题是直到第一个“,”遇到。

我的代码用于阅读就像:

void handle_write(const boost::system::error_code& error,
                  size_t bytes_transferred)
{
    if (!error)
    {
        boost::asio::async_read_until(
            socket_,
            inputStreamBuffer_,
            ',',
            boost::bind(
                &client::handle_read1, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred
            )
        );
    }
    else
    {
        std::cout << "Write failed: " << error << "\n";
    }
}

void handle_read1(const boost::system::error_code& error,
                  size_t bytes_transferred)
{
    cout << "bytes_transferred=" << bytes_transferred << endl;

    if (!error)
    {
        cout << "0 size=" << inputStreamBuffer_.size() << endl;
        istream is(&inputStreamBuffer_);
        char c[1000];
        is.read(c,bytes_transferred);
        c[bytes_transferred]=0;
        for (int i=0;i<bytes_transferred;++i)
        {
            cout << dec << "c[" << i << "]=" << c[i] << " hex=" << hex << static_cast<int>(c[i]) << "#" << endl;
        }
    }
    else
    {
        std::cout << "Read failed: " << error << "\n";
    }
}

对于从另一方发送的流:

Y43,71,0,,91009802000000595=0000000000000000000

有时候,我读到这个:

bytes_transferred=4
0 size=47
c[0]=Y hex=59#
c[1]=4 hex=34#
c[2]=3 hex=33#
c[3]=, hex=2c#

对于从另一方发送的流:

Y43,72,0,,91009802000000603=0000000000000000000

但其他时候,我读到这个:

bytes_transferred=7
0 size=47
c[0]= hex=0#
c[1]= hex=0#
c[2]= hex=0#
c[3]= hex=0#
c[4]=7 hex=37#
c[5]=2 hex=32#
c[6]=, hex=2c#

套接字用SSL保护,客户端和服务器应用程序是boost_asio / example / ssl / *的略微修改的示例。

在第二个例子中,我松开整个标题:(

函数有四个重载,但我们只假设使用了第一个。 如果查看文档 ,那么您将看到bytes_transferred是指定的分隔符的字节数。

而且:

在成功执行async_read_until操作后,streambuf可能包含分隔符之外的其他数据。 应用程序通常会将该数据保留在streambuf中,以供后续的async_read_until操作进行检查。

解决。 我从服务器发送回复时,将std::string对象传递给boost::asio::buffer() ,而不是std::string.c_str()

正如文档建议的那样,您应该能够忽略bytes_transferred之外的任何bytes_transferred并再次调用async_read_until

但是,如果你碰巧在ASIO 1.5.3中使用了全新的SSL实现(它还没有正式升级),你可能会遇到我所做的相同问题(为此我提交了一个补丁):

http://comments.gmane.org/gmane.comp.lib.boost.asio.user/4803

它看起来并不像您正在使用新版本或遇到同样的问题,但如果您遇到一些限制并且受到新实现的优势所诱惑,则需要注意这一点:

新实现编译速度更快,性能显着提高,并支持自定义内存分配和处理程序调用。 它包括新的API功能,例如证书验证回调,并改进了错误报告。 对于大多数用途,新实现与旧的源代码兼容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM