上面是一个包含我的应用程序依赖关系的架构(只有这个问题涉及的那个)
+-----------------+
| application |
+-----------------+
| libcurl | libqt |
+-----------------+
| libssl |
+-----------------+
我的c ++应用程序基于qt 4.8.1但是对于某些http /网络操作,我们使用libcurl 这两个库都是使用ssl支持编译的 我面临一个非常奇怪的错误场景:
错误设置证书验证位置:CAfile: /etc/ssl/certs/ca-certificates.crt CApath:none
第二次调用会生成QTcpError。 QSslSocket报告的错误字符串是:
TCP Error: Error while reading: error:02001002:system library:fopen:No such file or directory, error:2006D080:BIO routines:BIO_new_file:no such file, error:0B084002:x509 certificate routines X509_load_cert_crl_file:system lib
两个对象都存在于同一个应用程序线程中。
使用gdb跟踪应用程序行为,似乎是:
我的想法是SSL lib状态在某种程度上是全局的(即errno)和/或在两个库(qt和libcurl)之间共享并执行QSslSocket.write()我们得到了libcurl调用先前设置的错误状态。
请注意,qt write方法实际上在内部执行写入和从套接字读取。之后,使用 SSL_get_error
检查ssl的状态(Qt代码:https://github.com/qt/qt/blob/v4.8.1/src/network/ssl/qsslsocket_openssl.cpp#L1140)