2011-11-04 64 views
0

所以我想实现定时http连接Keep-Alive。而且我需要能够在一段时间内杀死它。所以目前我有(或至少我想有):如何读取asio缓冲区从一个套接字读取`1`字节而不是从另一个读取`read_some`?

void http_request::timed_receive_base(boost::asio::ip::tcp::socket& socket, int buffer_size, int seconds_to_wait, int seconds_to_parse) 
{ 
    this->clear(); 

    http_request_parser_state parser_state = METHOD; 

    char* buffer = new char[buffer_size]; 
    std::string key = ""; 
    std::string value = ""; 
    boost::asio::ip::tcp::iostream stream; 
    stream.rdbuf()->assign(boost::asio::ip::tcp::v4(), socket.native()); 
    try 
    { 
     do 
     { 
      stream.expires_from_now(boost::posix_time::seconds(seconds_to_wait)); 
      int bytes_read = stream.read_some(boost::asio::buffer(buffer, buffer_size)); 
      stream.expires_from_now(boost::posix_time::seconds(seconds_to_parse)); 
      if (stream) // false if read timed out or other error 
      { 
       parse_buffer(buffer, parser_state, key, value, bytes_read); 
      } 
      else 
      { 
       throw std::runtime_error("Waiting for 2 long..."); 
      } 


     } while (parser_state != OK); 
    } 
    catch (...) 
    { 
     delete buffer; 
     throw; 
    } 
    delete buffer; 
} 

但在TCP :: iostream的无read_some,所以编译器给我一个错误:

Error 1 error C2039: 'read_some' : is not a member of 'boost::asio::basic_socket_iostream<Protocol>'  

这就是为什么我不知道 - 如何通过stream.read(如stream.read(buffer, 1);)读取1个字节,比read_some通过套接字API是非常缓冲区(它看起来像int bytes_read = socket.read_some(boost::asio::buffer(buffer, buffer_size));,比打电话给我用实际bytes_readparse_buffer功能)

顺便说一句,似乎会有一个真正令人难过的问题,最后1个字节..(

回答

0

对不起,有点粗糙,但你看过文档吗? socket iostream应该像普通的iostream一样工作,如cincout。只要做stream >> var。也许你想要basic_stream_socket::read_some而不是?