Libcurl 是功能強大、跨平台、支援多種協定(HTTP/HTTPS/FTP/FTPS/TFTP/TELNET/DICT/LDAP/FILE)的客戶端 URL 傳輸庫,執行緒安全、支援 IPv6,廣泛用於 C/C++ 網路應用開發。
wget https://curl.haxx.se/download/curl-7.39.0.tar.gz tar -xzvf curl-7.39.0.tar.gz cd curl-7.39.0 yum install gcc gcc-c++ openssl-devel ./configure --with-ssl make make install
安裝後可用 curl-config --libs --cflags 取得編譯連結參數。
| 分類 | 函數/選項 | 說明 |
|---|---|---|
| 全域初始化 | curl_global_init(flags) | CURL_GLOBAL_ALL/SSL/WIN32/NOTHING |
| curl_global_cleanup() | 釋放全域資源 | |
| Easy Handle | curl_easy_init() | 建立易用介面控制代碼 |
| curl_easy_cleanup(handle) | 釋放 handle | |
| curl_easy_setopt | CURLOPT_URL | 目標 URL |
| CURLOPT_WRITEFUNCTION | 資料回呼函數 | |
| CURLOPT_WRITEDATA | 回呼的 userp 指標 | |
| CURLOPT_PROGRESSFUNCTION | 進度回呼(需 NOPROGRESS=0) | |
| CURLOPT_TIMEOUT | 總超時秒數 | |
| CURLOPT_CONNECTTIMEOUT | 連線階段超時 | |
| CURLOPT_FOLLOWLOCATION | 支援 3xx 重導向 | |
| CURLOPT_RANGE | 斷點續傳範圍 "0-200" | |
| 執行 | curl_easy_perform(handle) | 啟動傳輸,阻塞至完成 |
CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_perform(curl); curl_easy_cleanup(curl);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM"); curl_easy_setopt(curl, CURLOPT_SSLCERT, "client.pem"); curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM"); curl_easy_setopt(curl, CURLOPT_SSLKEY, "client.key"); curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "passphrase"); curl_easy_setopt(curl, CURLOPT_CAINFO, "ca.pem"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, header_fp); curl_easy_setopt(curl, CURLOPT_WRITEDATA, body_fp);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_PUT, 1L); curl_easy_setopt(curl, CURLOPT_READDATA, fp); curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, filesize);
struct curl_httppost *formpost = NULL, *lastptr = NULL;
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "sendfile",
CURLFORM_FILE, "localfile.txt",
CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
gcc -o example example.c -lcurl # 或使用 pkg-config gcc -o example example.c $(pkg-config --cflags --libs libcurl)
curl_global_init,避免重複初始化競爭。CURLOPT_WRITEFUNCTION 可能被多次呼叫,需正確處理 size * nmemb 總長度。CURLOPT_NOPROGRESS=0 並設定進度回呼,避免長時間無回應被視為凍結。