通过多个线程发送消息以进行卷曲,有时我会收到以下错误之一。
curl_easy_perform():失败的ssl连接错误。 sschannel:下一个 initializesecuritycontext失败:SEC_E_MESSAGE_ALTERED
curl_easy_perform():失败的ssl连接错误。 sschannel:下一个 initializesecuritycontext失败:SEC_E_BUFFER_SMALL
到目前为止,我正在通过重新发送请求来解决此问题。但是为什么会发生此错误(在接下来的40秒钟内执行相同的请求),并且可以避免这种情况。
源代码用C ++编写。 LibCurl是使用Microsoft Visual Studio 2010构建的。 以下是调用curl库的代码。
CURL *curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "connection-page");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestToPost.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(requestToPost.c_str()));
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerInfo);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curlErrorbuffer);
std::stringstream resPonseInfo;
std::stringstream headerResponse;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resPonseInfo);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headerResponse);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
res = curl_easy_perform(curl);
if ((res != CURLE_OK))
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
std::cout << "Request === " << std::endl;
std::cout << requestToPost << std::endl;
std::cout << "Error === " << std::endl;
std::cout << curlErrorbuffer << std::endl;
std::cout << "Header == " << std::endl << headerResponse.str() << std::endl;
std::cout << "Response == " << std::endl << resPonseInfo.str() << std::endl;
}
else // if(res == CURLE_OK)
{
std::cout << "Response from the http post was successful " << std::endl;
responseInfo = resPonseInfo.str();
}
curl_easy_cleanup(curl);
curl = NULL;
}
答案 0 :(得分:2)
“正在发送消息以通过多个线程卷曲...”-给定描述的症状,最合乎逻辑的做法是假设与多线程相关的问题
libcurl本身是线程安全的,但不是共享的数据和使用的句柄。您可能需要参考以下页面:https://curl.haxx.se/libcurl/c/threadsafe.html,并确保您的线程没有互相踩脚趾
一种(可能)简单的方法来确认上述假设-尝试以单线程模式运行程序(如果可以),然后查看问题是否再次发生。如果这样做的话,那肯定不是线程。
另一种验证方式(如果不是上述选项)(在开始设置curl选项之前)将线程互斥锁放在curl操作上-看看这是否有助于避免这些错误