Как прочитать в буфер asio, скажем, `1` байт из одного сокета и чем `read_some` больше из другого?

#c #boost #tcp #boost-asio #keep-alive

#c #повысить #tcp #boost-asio #keep-alive

Вопрос:

Итак, я пытаюсь реализовать синхронизацию http-соединения. И мне нужно иметь возможность отключить его по истечении некоторого времени ожидания. Итак, в настоящее время у меня есть (или, по крайней мере, я хотел бы иметь):

 void http_request::timed_receive_base(boost::asio::ip::tcp::socketamp; 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>'    
  

Вот почему мне интересно — как прочитать 1 байт через stream.read (например stream.read(buffer, 1); ), а затем read_some в этот самый буфер через socket API (это будет выглядеть как int bytes_read = socket.read_some(boost::asio::buffer(buffer, buffer_size)); и чем вызвать мою parse_buffer функцию с реальным bytes_read значением)

Кстати, похоже, что будет действительно печальная проблема с 1 последним байтом ..(

Ответ №1:

Извините за грубость, но вы читали документацию? Предполагается, что сокет iostream должен работать как обычный iostream, как cin и cout . Просто сделайте stream >> var . Может быть, вы хотите basic_stream_socket::read_some вместо этого?