gpt4 book ai didi

c++ - 使用 boost asio 接收文本的最有效方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:36 25 4
gpt4 key购买 nike

现在我通过以下方式接收短信:

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

最佳答案

总共您将拥有接收到的文本的两份拷贝:一份在流缓冲区中,另一个在字符串中。 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;
}
}

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

关于c++ - 使用 boost asio 接收文本的最有效方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14877287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com