Можно ли сделать async_handshake после чтения из сокета до использования Boost :: asio? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть boost::asio::ssl::stream<boost::asio::ip::tcp::socket> напечатанная розетка. Когда boost впервые принимает соединение с этим сокетом, я хочу посмотреть на некоторые байты. Однако заглядывание - это не то, что вы можете сделать правильно / безопасно. Поэтому я прочитал нужные мне байты и поместил их в буфер.

typedef socket_type boost::asio::ssl::stream<boost::asio::ip::tcp::socket>;
void OnAccept(std::shared_ptr<socket_type> socket)
{
    boost::asio::mutable_buffers_1 sslBuffer(m_Buffer.data(), m_Buffer.size());
    // I'm going to read 4 bytes from the socket.
    boost::system::error_code ec;
    std::size_t readBytes = boost::asio::read(socket->next_layer(), boost::asio::buffer(sslBuffer, 4), ec);
    if(ec) { Stop(); return; } // pseudo

    // Check the bytes I read in the buffer

    socket->async_handshake(boost::asio::ssl::stream_base::server, sslBuffer, &handler);
}

В этот момент будет вызван обработчик async_handshake, но он сообщит мне, что получил код ошибки unexpected message от ssl. Это имеет смысл: в сообщении, с которым выполняется рукопожатие, скорее всего, отсутствуют первые 4 байта!

Что я могу сделать, чтобы обеспечить async_handshake надлежащим буфером, который сообщает ему, что в нем уже есть действительные 4 байта?

1 Ответ

0 голосов
/ 20 апреля 2019

После исследования реализации метода перегрузки буфера async_handshake выясняется, что в буфере уже должно быть прочитано рукопожатие.

Я пытался сделать это, но все еще сталкивался с проблемами, я продолжал получать код ошибки, говорящий, что версия SSL была неправильной. Я знал, что это не проблема, потому что не использовалась буферная перегрузка async_handshake, которая работала нормально!

Тогда было решено ограничить размер параметра буфера.

typedef socket_type boost::asio::ssl::stream<boost::asio::ip::tcp::socket>;
void OnAccept(std::shared_ptr<socket_type> socket)
{
    const uint bytesToPeek = 4;
    boost::asio::mutable_buffers_1 sslBuffer(m_Buffer.data(), m_Buffer.size());
    // I'm going to read 4 bytes from the socket.
    boost::system::error_code ec;
    std::size_t readBytes = boost::asio::read(socket->next_layer(), boost::asio::buffer(sslBuffer, bytesToPeek), ec);
    if(ec) { Stop(); return; } // pseudo

    // Check the bytes I read in the buffer

    // Read in the rest of the handshake.
    std::size_t bytesOfHandshake = socket->next_layer().read_some(boost::asio::buffer(sslBuffer+bytesToPeek, 4000));
    bytesOfHandshake += bytesToPeek;

    // Finish the handshake.
    socket->async_handshake(boost::asio::ssl::stream_base::server, boost::asio::buffer(sslBuffer, bytesOfHandshake), &handler);
}

Обратите внимание, что и вызовы read и read_some в этом случае также должны быть сделаны async. Я просто хотел продемонстрировать ответ без обработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...