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

全体として、受信したテキストの 2 つのコピーが作成されます。1 つは streambuf に、もう 1 つは文字列に含まれます。はboost::asio::buffer単なるポインターであり、文字列とサイズを指しています。

stringbuf から直接 pingback を送信することができない場合は、それが最善の方法です。ただし、最初にストリームバッファのコンテンツを送り返し、後で内部使用のためにそれを消費することに問題があるとは思いません。

コードは次のようになります。

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 に答える