如何破译提升asio ssl错误代码?

时间:2012-03-22 18:11:04

标签: c++ boost ssl boost-asio

我在增强的asio ssl实现中偶尔会出现通信故障,boost返回的超级有用的错误消息是'asio.ssl:336458004'

我怀疑数字图是由SSL标志组成的某种聚合结构,我说因为linux错误代码,boost asio错误代码和ssl错误代码没有任何引用'336458004',所以大概它必须动态构建。

任何人都可以提供一些有关我应该如何破译此错误代码的信息吗?谢谢。

2 个答案:

答案 0 :(得分:12)

他们使用来自crypto / err / err.h的ERR_PACK

这将允许将错误转换为字符串

#include <crypto/err/err.h>

string err = error.message()
if (error.category() == boost::asio::error::get_ssl_category()) {
    err = string(" (")
            +boost::lexical_cast<string>(ERR_GET_LIB(error.value()))+","
            +boost::lexical_cast<string>(ERR_GET_FUNC(error.value()))+","
            +boost::lexical_cast<string>(ERR_GET_REASON(error.value()))+") "
    ;
    //ERR_PACK /* crypto/err/err.h */
    char buf[128];
    ::ERR_error_string_n(error.value(), buf, sizeof(buf));
    err += buf;
}

可能不包含在boost中,所以asio在使用纯套接字时不需要链接到ssl

答案 1 :(得分:3)

我最终通过在调试中构建openssl并在OpenSSL错误报告函数ERR_put_error上设置断点来获得对该问题的一些了解。

callstack显示问题源自SSL_read,这是由于握手函数尚未初始化而引起的。 ERR_put_error函数使用的实际错误编号为276,如何将其设置为336458004的增强功能超出了我的范围。错误本身是由一个全局标志引起的,当我通过代理隧道到远程HTTPS服务器时,我用它来切换SSL功能。

希望这有助于某人。