加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用boost asio接收文本的最有效方法?

发布时间:2020-12-16 07:35:05 所属栏目:百科 来源:网络整理
导读:现在我正在通过以下方式接收文本: boost::asio::streambuf buffer; std::string text; while(true) { try { boost::asio::read_until(*m_pSocket,buffer,"END"); text = boost::asio::buffer_castconst char*(buffer.data()); buffer.consume(text.size());
现在我正在通过以下方式接收文本:

boost::asio::streambuf buffer;           
    std::string text;
    while(true) {   
        try
        {

            boost::asio::read_until(*m_pSocket,buffer,"END");

            text = boost::asio::buffer_cast<const char*>(buffer.data());
            buffer.consume(text.size());

            boost::asio::write(*m_pSocket,boost::asio::buffer(text,text.size()));
            std::cout << text<< std::endl;
        }
        catch (std::exception& e)
        {
            std::cerr << "Exception: " << e.what() << "n";
            break;
        }       
    }

当收到序列“END”时,我只是将收到的文本回显给客户端.我的问题:

在我看来,将streambuf转换为字符串然后从中消耗文本符号似乎非常无效.以一种漂亮,干净和高效的方式处理收到的数据的正确方法是什么?

解决方法

总之,您将收到两份收到的文本:一份在streambuf中,另一份在字符串中. boost :: asio :: buffer只是一个指针,指向字符串和大小.

如果直接从stringbuf发送pingback不是一个选项,那么这是你能得到的最好的.但是,我没有看到首先发回streambuf的内容然后为了内部使用而消费它的问题.

您的代码可能如下所示:

boost::asio::streambuf buffer;           
while(true) {   
    try
    {
        auto size = boost::asio::read_until(*m_pSocket,"END");

        //send back the seuqence:
        auto begin = boost::asio::buffer_cast<const char*>(buffer.data());
        boost::asio::write(*m_pSocket,boost::asio::buffer(begin,size));

        //consume the content...
        std::istream is(&buffer);
        is >> /* whatever fits here... */
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "n";
        break;
    }       
}

除此之外,我不会发回整个序列.根据发送的序列的平均大小,最好在运行中计算校验和并将其发送回而不是整个序列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读