提升Asio如何在不使用SSL的SSL套接字上读/写?

时间:2012-03-30 13:02:55

标签: c++ boost ssl boost-asio

标题是我的问题。

我已在此处找到与此相关的主题 - > Using SSL sockets and non-SSL sockets simultaneously in Boost.Asio?
基本上我处于相同的情况但由于某种原因我不能在那里发表评论和/或直接联系提问者所以我这样做是一个新问题。

我有一个设置ssl socket ssl::stream<ip::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连接。
然后使用{{1在异步函数中,我使用了socket_

以下是建议的代码:

socket_.lowest_layer()

然而,似乎编译器不接受此解决方案。当我尝试使用具有socket_.lowest_layer()作为流的异步函数编译代码时,此错误显示出来(它仅用于async_read,async_write具有类似的错误):

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

所以现在我几乎陷入困境,我真的希望你能帮助我。搜索错误没有带来什么,因为它应该可行,我不知道错误是什么......

1 个答案:

答案 0 :(得分:9)

其实我觉得我现在已经解决了。

1)非ssl上的“握手”确实没有必要,我接受后立即做async_reading

2)而不是async_read/write( socket_.lowest_layer(), ... )我必须使用socket_.next_layer().async_read_some( buffer, handler)async_write( socket_.next_layer(), ... )

我仍然不知道为什么它不适用于socket_.lowest_layer()(如果有人知道,请解释)但至少它适用于上述方法。我希望这也可以帮助其他有类似问题的人; - )