【发布时间】:2016-10-13 16:32:10
【问题描述】:
当使用 Boost Asio SSL 流启动 async_handshake,然后在握手完成之前实现一个截止时间计时器以取消/关闭流时,程序将因缓冲区溢出异常而崩溃(在 Windows 上,我没有尝试过Linux)。崩溃发生在套接字为closed 之后,外部处理程序完成执行,但在run() 命令完成之前。
在进行 SSL 握手时,是否有无法关闭套接字的原因?或者这是 Boost Asio 中的错误?
class Connection
{
void connect_handler(const boost::system::error_code &err)
{
...
ssock->async_handshake(boost::asio::ssl::stream_base::client,
boost::bind(&Connection::handle_handshake, this, _1));
...
}
void handle_handshake(const boost::system::error_code &err)
{
// CONNECTED SECURELY
}
void handle_timeout()
{
// HANDLE SSL SHUTDOWN IF ALREADY CONNECTED...
...
ssock->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
ssock->close();
delete ssock;
}
...
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> *ssock;
};
澄清一下,在 IO 服务调用 handle_handshake() 之前调用 handle_timeout() 会在 io_service::run() 方法中崩溃。
【问题讨论】:
-
在
timeout之后,您的Connection对象是否仍在范围内?见boost-async-functions-and-shared-ptrs -
必须如此,因为
io_service是Connection类的成员。该成员的io_service::run()方法在退出前会崩溃,因此看起来像是OpenSSL 的内部问题。超时适用于所有标准 TCP 作业。 -
让
io_service成为连接的成员是不寻常的,它通常是更高级别的对象。我建议将其从您的Connection课程中删除,并确保其范围持续到(至少)main()结束...