首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::asio::placeholders::bytes_transferred的含义是什么

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

Stack Overflow用户
提问于 2011-06-20 13:17:16
回答 3查看 4.9K关注 0票数 3

boost::asio::placeholders::bytes_transferredasync_read_until()中的含义是什么?在回调函数中,它返回的值比streambuf.size()小。streambuf在回调之前是安全的。总之,.bytes_transferred不是通过套接字的实际字节数,而是较少的字节数。我是误解了这一切,还是什么?

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

Y43,72,0,,91009802000000603=0000000000000000000

"Y43," -是标题。

"Y" -是消息类型。

"43" -需要读取的额外字节

"," -定界符头是直到第一个",“遇到。

我的代码是用来阅读的就像:

代码语言:javascript
运行
复制
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/*中略有修改的示例。

在第二个示例中,我松开了整个头:(

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-21 15:24:13

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-20 13:28:38

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

此外:

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

票数 4
EN

Stack Overflow用户

发布于 2011-06-20 19:26:41

正如文档所建议的那样,您应该能够忽略bytes_transferred以外的任何内容,只需再次调用async_read_until即可。

但是,如果您碰巧在ASIO 1.5.3中使用全新的SSL实现(这还不是boost的正式组成部分),您可能会遇到与我一样的问题(为此我提交了一个修补程序):

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

看起来您并不是在使用新版本或遇到相同的问题,但是如果遇到了一些限制,并且受到了新实现的好处的诱惑,那么应该注意:

新的实现编译速度更快,性能明显提高,并支持自定义内存分配和处理程序调用。它包括新的API特性,如证书验证回调,并改进了错误报告。在大多数情况下,新的实现是与旧的兼容的。

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

https://stackoverflow.com/questions/6411740

复制
相关文章

相似问题

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