libcurl 是 C/C++ 領域最廣泛使用的網絡傳輸庫,支持 HTTP/HTTPS、FTP、SFTP 等多種協議。本文通過一個完整的 HTTP GET 客戶端示例,深度解析 libcurl easy 接口 的核心工作流:句柄創建、選項配置、回調函數設計、執行傳輸與資源清理。
#define MAX_BUF 65536 // 64KB 接收緩衝區 char wr_buf[MAX_BUF + 1]; // 數據存儲區,+1 預留結束符 int wr_index = 0; // 當前寫入偏移 int wr_error = 0; // 錯誤標志,傳遞給回調上下文
libcurl 在接收到數據時會多次調用此回調,參數含義:
buffer:libcurl 內部緩衝區指針size * nmemb:本次數據總字節數userp:用戶自定義上下文(此處為 &wr_error)size_t write_data(void* buffer, size_t size, size_t nmemb, void* userp) {
int segsize = size * nmemb;
int* pError = (int*)userp;
// 緩衝區溢出保護
if (wr_index + segsize > MAX_BUF) {
*pError = 1;
return 0; // 返回 0 通知 libcurl 中止傳輸
}
memcpy(&wr_buf[wr_index], buffer, segsize);
wr_index += segsize;
wr_buf[wr_index] = '\0'; // 確保字符串結束,便於直接 printf
return segsize; // 返回實際處理字節數,告知 libcurl 繼續
}
int main() {
CURL* curl = curl_easy_init();
if (!curl) {
fprintf(stderr, "curl_easy_init 失敗\n");
return 1;
}
// 1. 設置目標 URL
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
// 2. 註冊寫回調與上下文
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &wr_error);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
// 3. 執行傳輸(阻塞直到完成或出錯)
CURLcode ret = curl_easy_perform(curl);
// 4. 結果處理與清理
printf("ret=%d (write_error=%d)\n", ret, wr_error);
if (ret == CURLE_OK && wr_error == 0) {
printf("%s", wr_buf); // 直接輸出響應體
}
curl_easy_cleanup(curl);
return (ret == CURLE_OK && wr_error == 0) ? 0 : 1;
}
| 選項 | 作用 | 本例值 |
|---|---|---|
| CURLOPT_URL | 請求目標地址 | "https://www.example.com" |
| CURLOPT_WRITEFUNCTION | 數據到達時的回調函數 | write_data |
| CURLOPT_WRITEDATA | 傳給回調的用戶指針 | &wr_error |
| CURLOPT_TIMEOUT | 整個請求超時秒數 | (可選) 30L |
| CURLOPT_CONNECTTIMEOUT | 連接階段超時秒數 | (可選) 10L |
| CURLOPT_FOLLOWLOCATION | 自動跟隨重定向 | (可選) 1L |
| CURLOPT_SSL_VERIFYPEER | 驗證服務器證書(HTTPS) | (生產環境) 1L |
CURLOPT_WRITEDATA 傳 FILE*)或動態擴容策略。size * nmemb 表示成功;返回 0 或較小值會導致傳輸中斷。curl_easy_perform 返回值與自定義 wr_error,雙重保障。curl_easy_cleanup 必須在最後調用,釋放內部連接池、SSL 上下文等資源。gcc http_client.c -o http_client -lcurl
掌握 libcurl easy 接口的回調機制與配置選項,是 C/C++ 開發網絡客戶端、爬蟲、API 網關等應用的核心基礎。本示例代碼結構清晰,可直接作為生產項目網絡模塊的起點。