curl_easy_perform ():: SSL_connect_error - как ее решить? - PullRequest
0 голосов
/ 27 апреля 2019

Отправка сообщений для скручивания через несколько потоков, и время от времени я получаю одну из следующих ошибок:

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;
}

1 Ответ

2 голосов
/ 27 апреля 2019

«Отправка сообщений для скручивания через несколько потоков ...» - с учетом описанных симптомов наиболее логичным было бы предположить, что проблема, связанная с многопоточностью,

  • сама libcurl поточно-безопасна, ноне общие данные и используемые ручки.Возможно, вы захотите обратиться к этой странице: https://curl.haxx.se/libcurl/c/threadsafe.html и убедитесь, что ваши потоки не наступают друг на друга

  • один (возможно) простой способ подтвердить приведенную выше гипотезу - попробуйте запустить вашуПрограмма в режиме одного потока (если вы можете) и посмотреть, если проблема повторяется.Если это так, то это определенно не многопоточность.

  • еще один способ проверки (если выше не вариант), добавьте мьютекс потока в вашу операцию curl (даже до того, как вы начнете настраивать параметры curl)) - посмотрите, поможет ли это избежать этих ошибок

...