我在增强的asio ssl实现中偶尔会出现通信故障,boost返回的超级有用的错误消息是'asio.ssl:336458004'
我怀疑数字图是由SSL标志组成的某种聚合结构,我说因为linux错误代码,boost asio错误代码和ssl错误代码没有任何引用'336458004',所以大概它必须动态构建。
任何人都可以提供一些有关我应该如何破译此错误代码的信息吗?谢谢。
答案 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功能。
希望这有助于某人。