我有一个使用 boost::read_until 和 boost::streambuf 的客户端/服务器应用程序。我正在从套接字读取 XML 消息,并想用 tinyXML2 解析它,如下所示:
XMLDocument doc;
doc.parse(strPtr); // strPtr is const char*
我需要以某种方式从 streambuf 中提取 const char *strPtr 。到目前为止,我在堆栈交换中找到了三种方法:
// 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;
}
这三种方法都适用于我的代码(到目前为止)。方法 1 和 2 可能至少复制数据一次(或更多),而方法 3 执行其他操作。
每种方法发生了什么?相比之下,它们的速度有多快?就缓冲区溢出、线程或其他我以后可能在网络客户端/服务器应用程序中遇到的陷阱而言,这些是否更不安全?