gpt4 book ai didi

c++ - Libcurl 停止工作,SSL 连接错误

转载 作者:可可西里 更新时间:2023-11-01 18:37:40 26 4
gpt4 key购买 nike

我正在开发一个供个人使用的程序,该程序会定期抓取一些网页。其中一个需要使用 SSL,它的主要 URL 实际上是一个负载均衡器,每次都重定向到一个不同的域,这是少数几个(不确定这是否相关)。我对 libcurl 和 SSL 特别陌生,所以我可能遗漏了一些明显的东西,但我不这么认为。

该程序可以正常运行一段时间(到目前为止,不会超过一个小时),但是一旦它第一次遇到 SSL 连接错误,它就会每次都给出相同的错误。在开始失败之前,总是需要不同的时间量和不同数量的成功请求。

错误缓冲区始终包含以下内容:schannel:next InitializeSecurityContext failed:SEC_E_ILLEGAL_MESSAGE (0x80090326) - 此错误通常在收到致命的 SSL/TLS 警报时发生(例如握手失败)。 Windows 系统事件日志中可能提供了更多详细信息。

eventvwr 中没有任何用处。对该错误代码的搜索返回有关早期版本 Windows Server 上自签名证书问题的结果,但除此之外几乎没有其他结果。我无法控制要连接的服务器,但我怀疑它是 Windows 机器。

我的想法已经用完了,所以我只想提供任何可能相关的细节。我不能真正发布任何实际的源代码,因为我已经在几个类中抽象了所有 curl 调用,所以我必须粘贴大量样板代码才能让其他人理解它。不过,我已经通过 Visual Studio 调试器确认这就是实际调用的结果。

我在主线程中初始化 libcurl,然后再创建其他线程,如下所示:curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

然后我在第二个线程中创建并初始化实际的 curl 句柄,并且仅在该线程中,如下所示:

m_handle = curl_easy_init();
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this);
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug);
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, "");

我已经尝试将 CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER 设置为 0,但这没有帮助。

我使用 nmake/f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG= 从 curl-7.43.0.tar.gz 构建了 libcurl是 在 Visual Studio 2013 上。

这是怎么回事,我该如何解决?

最佳答案

我猜测您正在为所有请求使用单个 CURL 句柄(因为您说“我创建并初始化了实际的 curl 句柄”)。该解决方案最有可能为每个使用 curl_easy_perform() 完成的请求创建一个 CURL 句柄,然后立即使用 curl_easy_cleanup()。

您所看到的可能是服务器关闭 SSL 连接造成的。但是您的 CURL 句柄可能会保持其原样(即握手已完成),这不再合适。

关于c++ - Libcurl 停止工作,SSL 连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com