4

现在我通过以下方式接收文本:

    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 转换为字符串然后使用其中的文本符号非常低效。以良好、干净和有效的方式处理接收到的数据的正确方法是什么?

4

1 回答 1

2

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

如果不能直接从 stringbuf 发送 pingback,那是您可以获得的最佳选择。但是,我看不出首先发回 streambuf 的内容并在之后使用它供您内部使用会有什么问题。

您的代码可能如下所示:

boost::asio::streambuf buffer;           
while(true) {   
    try
    {
        auto size = boost::asio::read_until(*m_pSocket, buffer, "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;
    }       
}

除此之外,我不会发回整个序列。根据发送的序列的平均大小,动态计算校验和并将其发送回而不是整个序列可能会更好。

于 2013-02-14T16:03:25.837 回答