C 語言標準庫不直接提供網絡通信功能,需依賴操作系統 API 或第三方庫。實現網頁訪問本質是:
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 原始 Socket (Winsock/POSIX) | 零依賴、完全控制、學習價值高 | 需手動處理協議解析、HTTPS 極其複雜、易出錯 | 教學、極簡嵌入式、特殊協議 |
| libcurl | 功能全面、支持 HTTP/HTTPS/FTP 等、跨平台、成熟穩定、支持異步 | 引入外部依賴、體積較大 | 絕大多數生產項目首選 |
| OpenSSL + Socket | 可定製 TLS 行為、輕量級 | 需手動管理 SSL_CTX、證書驗證、錯誤處理繁瑣 | 對 libcurl 依賴受限、需深度定製的場景 |
| Windows WinHTTP/WinINet | 系統原生、無額外依賴、集成系統代理/憑證存儲 | 僅限 Windows、API 複雜 | Windows 桌面/服務程序 |
| 嵌入式專用庫 (如 mbedTLS, wolfSSL) | 體積小、針對嵌入式優化 | 功能較 libcurl 簡化 | 資源受限嵌入式設備 |
#include <curl/curl.h>
#include <stdio.h>
#include <string.h>
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata) {
strncat((char *)userdata, (char *)ptr, size * nmemb);
return size * nmemb;
}
int main() {
CURL *curl = curl_easy_init();
char response[4096] = {0};
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/data");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // 驗證服務器證書
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) printf("Response: %s\n", response);
else fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
gcc http_client.c -o http_client -lcurl
# HTTPS 需額外鏈接 OpenSSL(libcurl 通常自動處理)
# Windows 靜態編譯可能需 -DCURL_STATICLIB -lcurl -lssl -lcrypto -lws2_32 -lwldap32 -lcrypt32
CURLOPT_SSL_VERIFYPEER=1),防止中間人攻擊。CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT) 避免無限阻塞。CURL 句柄 (curl_easy_reset) 提升性能。CURLOPT_FOLLOWLOCATION) 與 Cookie (CURLOPT_COOKIEJAR)。mbedTLS 替代 OpenSSL 減小體積。