Как повысить Asio для чтения/записи в сокете SSL, который не использует SSL?

Заголовок мой вопрос.

Я уже нашел связанную с этим тему здесь -> Одновременное использование SSL-сокетов и не-SSL-сокетов в Boost.Asio?
и в основном я нахожусь в той же ситуации, но по какой-то причине я не мог прокомментировать там и/или напрямую связаться с задавшим вопрос, поэтому я делаю это как новый вопрос.

У меня есть настроенный сокет ssl ssl::stream<:tcp::socket> socket_;, где клиенты могут нормально подключаться с помощью

socket_.async_handshake(ssl::stream_base::server, session::handle_handshake)

, а затем читать/писать с помощью

async_write(socket_, buffer(send_data, send_length), session::handle_read)
socket_.async_read_some(buffer(recieved_data, max_length), session::handle_read)

Однако теперь я хочу использовать тот же тип сокета для создания соединений, которые не используют SSL.

Во-первых, я не уверен, как выполнить «рукопожатие», как это делается с SSL-соединением, как я упоминал выше.
Глядя на какой-то нормальный пример boost.asio, я предполагаю, что мне не нужно делать это для соединений без SSL, а просто напрямую читать/записывать в сокет после того, как он был принят?

Затем в качестве следующего шага я попытался сделать это, как описано в теме, о которой я упоминал выше, я добавил логический ssl к сеансу, чтобы проверить, является ли это SSL-соединением или нет.
Затем вместо использования socket_в асинхронных функциях я использовал socket_.lowest_layer().

Вот предлагаемый код:

if ( sslEnabled )
    boost::asio::async_write( secureSocket_ );
} else {
    boost::asio::async_write( secureSocket_.lowest_layer() );
}

Однако кажется, что компилятор не принимает это решение. Когда я пытаюсь скомпилировать код с помощью асинхронной функции, в которой есть socket_.low_layer() в качестве потока появляется эта ошибка (она только для async_read, async_write имеет аналогичную ошибку):

boost\asio\impl\read.hpp(263): error C2039: 'async_read_some' : is not a member of 'boost::asio::basic_socket'
          with
          [
              Protocol=boost::asio::ip::tcp,
              SocketService=boost::asio::stream_socket_service
          ]
          boost\asio\impl\read.hpp(255) : while compiling class template member function 'void boost::asio::detail::read_op::operator ()(const boost::system::error_code &,size_t,int)'
          with
          [
            AsyncReadStream=boost::asio::basic_socket>,
              MutableBufferSequence=boost::asio::mutable_buffers_1,
              CompletionCondition=boost::asio::detail::transfer_all_t,
              ReadHandler=boost::_bi::bind_t,boost::_bi::list3,boost::arg<1>,boost::arg<2>>>
          ]
          boost\asio\impl\read.hpp(527) : see reference to class template instantiation 'boost::asio::detail::read_op' being compiled
          with
          [
              AsyncReadStream=boost::asio::basic_socket>,
              MutableBufferSequence=boost::asio::mutable_buffers_1,
              CompletionCondition=boost::asio::detail::transfer_all_t,
              ReadHandler=boost::_bi::bind_t,boost::_bi::list3,boost::arg<1>,boost::arg<2>>>
          ]
          c:\asio_test\source\server.cpp(131) : see reference to function template instantiation 'void boost::asio::async_read,boost::asio::mutable_buffers_1,boost::_bi::bind_t>(AsyncReadStream &,const MutableBufferSequence &,const ReadHandler &)' being compiled
          with
          [
              Protocol=boost::asio::ip::tcp,
              SocketService=boost::asio::stream_socket_service,
              R=void,
              F=boost::_mfi::mf2,
              L=boost::_bi::list3,boost::arg<1>,boost::arg<2>>,
              AsyncReadStream=boost::asio::basic_socket>,
              MutableBufferSequence=boost::asio::mutable_buffers_1,
              ReadHandler=boost::_bi::bind_t,boost::_bi::list3,boost::arg<1>,boost::arg<2>>>
          ]

Build FAILED.

Так что теперь я в значительной степени застрял, и я действительно надеюсь, что вы можете мне помочь. Поиск ошибки ничего не дал, и поскольку она должна работать, я не знаю, в чем может быть ошибка...

5
задан Community 23 May 2017 в 10:30
поделиться