Как получить положение потока сокета при чтении - PullRequest
0 голосов
/ 02 мая 2018

Можно ли найти смещение или положение сокета потока, пока вы используете функцию boost, например async_read_some ?

Например, я использую следующий код в handle_read , когда программа читает большое количество текста json в сеансе сокета, и я хочу точно знать позицию потока, когда я читаю данные следующим образом:

socket.async_read_some(
    boost::asio::buffer(data, max_length),
    boost::bind(&Session::handle_read, this, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
 );
 //socket.get_offset() or socket.get_position()

В документации я не могу найти подходящее решение для этого.

Максимальный размер буфера составляет 65536 байт, но сокет получает текст json еще больше.

Я не могу правильно добавить куски буфера в правильную позицию, потому что async делает это в каком-то виде случайного результата, но мне нужно сделать это правильно.

1 Ответ

0 голосов
/ 02 мая 2018

Если вы хотите получить фактический размер полученных данных, их значение можно получить внутри функции обратного вызова (Session::handle_read) во втором параметре.

Для чтения больших потоков вы можете проверить boost::asio::error::eof код ошибки внутри обработчика

    if (!err)
    {
        // Continue reading remaining data until EOF.
    }
    else if (err != boost::asio::error::eof)
    {
        std::cout << "Error: " << err << "\n";
    }
...