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