2013-02-14 20 views
4

现在我通过以下方式接收文本:使用boost asio接收文本的最有效方法?

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”当我刚收到的回波文本到客户端。我的问题:

在我看来非常inefficent到流缓冲转换为字符串,然后消耗从它的文字标志。以良好,干净和高效的方式处理收到的数据的正确方式是什么?

+0

如果你需要的是发送'streambuf',您可以直接做到这一点,没有用'string'。 – 2013-02-14 15:15:23

+0

不是。在目前的情况下,这已经足够了,但是我的应用程序在以后会变得更复杂 – Anonymous 2013-02-14 15:24:03

+0

'buffer_cast ''会返回'const char *'。从这一点你可以用这个常量缓冲区来做任何你想要的。 – 2013-02-14 15:29:31

回答

2

总之,你将有接收到的文本的两个副本:一个在流缓冲,其他的的字符串中。 boost::asio::buffer只是一个指针,指向字符串和大小。

如果直接从发送的StringBuf该通告是不是一种选择,那就是你可以得到最好的。但是,我不明白首先发回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; 
    }  
} 

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

相关问题