Заголовок мой вопрос.
Я уже нашел связанную с этим тему здесь -> Одновременное использование 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.
Так что теперь я в значительной степени застрял, и я действительно надеюсь, что вы можете мне помочь. Поиск ошибки ничего не дал, и поскольку она должна работать, я не знаю, в чем может быть ошибка...