После исследования реализации метода перегрузки буфера 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
. Я просто хотел продемонстрировать ответ без обработчиков.