2

boost::streambuf で boost::read_until を使用するクライアント/サーバー アプリケーションがあります。私はソケットから XML メッセージを読んでいて、これを tinyXML2 で次のように解析したいと考えています。

XMLDocument doc;
doc.parse(strPtr); // strPtr is const char* 

どうにかしてストリームバッファから const char *strPtr を抽出する必要があります。これまでのところ、スタック交換で 3 つの方法を見つけました。

// method 1, string constructor
const char * streambufToPtr(boost::asio::streambuf &message) {
    boost::asio::streambuf::const_buffers_type bufs = message.data();
    std::string astr(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + message.size());
    return astr.c_str();
}

// method 2, stringstream
const char * streambufToPtr(boost::asio::streambuf &message) {
    std::ostringstream ss;
    ss << &message;
    std::string astr = ss.str();
    return astr.c_str();
}

// method 3, buffer_cast
const char * streambufToPtr(boost::asio::streambuf &message) {
    const char* bufPtr=boost::asio::buffer_cast<const char*>(message.data());
    return bufPtr;
}

3 つの方法はすべて、私のコードで機能します (これまでのところ)。方法 1 と 2 はおそらくデータを少なくとも 1 回 (またはそれ以上) コピーしますが、方法 3 は別のことを行います。

それぞれの方法では何が行われますか? 比較してどれくらい速いですか?後でネットワーク クライアント/サーバー アプリケーションで遭遇する可能性があるバッファ オーバーフロー、スレッド化、またはその他のトラップに関して、これらのいずれかがより安全ではないでしょうか?

4

1 に答える 1