Что такое библиотека libcurl и как её использовать в C++?

«Что такое библиотека libcurl и как её использовать в C++?» — вопрос из категории Сети, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

libcurl — это кроссплатформенная клиентская библиотека на языке C для передачи данных по URL, поддерживающая множество протоколов (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, SMTP и др.). Она предоставляет простой и единообразный API для выполнения сетевых запросов. В C++ проектах она часто используется через C-интерфейс или C++-обёртки.

Ключевые возможности:

  • Поддержка SSL/TLS (через OpenSSL, Schannel, Secure Transport и др.).
  • Асинхронные (non-blocking) и синхронные вызовы.
  • Прокси, HTTP-куки, аутентификация (Basic, Digest, NTLM, Kerberos).
  • Загрузка и отправка файлов, поддержка многопоточности.
  • Минимальные зависимости, высокая производительность.

Базовый пример синхронного HTTP GET-запроса на C++:

#include <iostream>
#include <curl/curl.h>

// Callback-функция для записи полученных данных
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* userp) {
    size_t totalSize = size * nmemb;
    userp->append(static_cast<char*>(contents), totalSize);
    return totalSize;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT); // Инициализация libcurl
    curl = curl_easy_init();

    if (curl) {
        // Установка опций запроса
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/data");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
        curl_easy_setopt(curl, CURLOPT_USERAGENT, "MyCppApp/1.0");
        // Для HTTPS рекомендуется явно задать путь к CA bundle или использовать CURLOPT_CAINFO
        // curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/cacert.pem");

        // Выполнение запроса
        res = curl_easy_perform(curl);

        // Проверка результата
        if (res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << 'n';
        } else {
            long http_code = 0;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
            std::cout << "HTTP код ответа: " << http_code << 'n';
            std::cout << "Получено данных: " << readBuffer.size() << " байтn";
            // std::cout << "Тело ответа: " << readBuffer << 'n';
        }

        // Очистка
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();
    return 0;
}

Типичные сценарии использования в C++ проектах:

  1. Загрузка данных из REST API (JSON/XML).
  2. Отправка метрик или логов на сервер.
  3. Реализация автообновления приложения.
  4. Интеграция с облачными хранилищами (загрузка/выгрузка файлов).

Альтернативы в экосистеме C++: Для более идиоматичного C++ кода можно рассмотреть библиотеки-обёртки над libcurl (например, curlpp) или нативные C++ библиотеки, такие как Boost.Beast (для HTTP/WebSocket) или cpp-httplib. Однако libcurl остаётся отраслевым стандартом благодаря своей зрелости, стабильности и широте поддерживаемых протоколов.