使用Boost :: asio从套接字读取后是否可以执行async_handshake?

时间:2019-04-19 18:04:28

标签: c++ ssl boost

我有一个function allowip() { var id = $('#path').val(); var request_url = "<?php echo base_url(); ?>"+"client/home/get_ip/"; $.ajax({ type: "POST", url: request_url, data: {'id': id}, success: function(abc) { alert(abc); }, error:function(data) { alert('no working'); } }); } public function get_ip() { $day = $this->input->post('id'); echo $day; } 型插座。当boost首先接受与此套接字的连接时,我想窥视一些字节。但是,偷看并不是您可以正确/安全地执行的操作。因此,我读取了我需要的字节并将其放在缓冲区中。

if x and 32 = 32 then "the bit is ON"

这时,将调用boost::asio::ssl::stream<boost::asio::ip::tcp::socket>的处理程序,但它会告诉我它从ssl得到了一个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); } 错误代码。这是有道理的:正在与之进行握手的消息可能丢失了前4个字节!

我该怎么做才能为async_handshake提供适当的缓冲区,通知它其中已经有4个字节了?

1 个答案:

答案 0 :(得分:0)

在研究了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);
}

请注意,与此同时进行的readread_some调用也应进行async。我只是想在没有处理程序的情况下演示答案。