Mac環境配置
原本是想通過源碼編譯 curl, openssl, 發現各種小問題。
最後發現, 還是 `brew install curl` 一條指令搞定。
If you need to have curl first in your PATH, run:
echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.zshrc
For compilers to find curl you may need to set:
export LDFLAGS="-L/usr/local/opt/curl/lib"
export CPPFLAGS="-I/usr/local/opt/curl/include"
第一個Sample
- CMakeList.txt
cmake_minimum_required(VERSION 3.19)
project(linux_c C)
set(CMAKE_C_STANDARD 99)
add_executable(linux_c main.c)
# 添加頭文件目錄
include_directories(
/usr/local/opt/curl/include
)
# 添加庫目錄
link_directories(
/usr/local/opt/curl/lib
)
# 添加鏈接庫
target_link_libraries(
linux_c
curl
)
- main.c
#include <stdio.h>
#include "curl/curl.h"
int main(void) {
CURL *curl;
CURLcode res;
char *url = "https://ifconfig.cc";
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
return 0;
}
輸出 你的ip信息。
進一步學習參考: https://curl.se/libcurl/c/libcurl-tutorial.html
curl http get 方法實戰
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "curl/curl.h"
char *data = NULL;
size_t data_size = 0;
/**
* 需要在這個函數裏完成分段數據整合,我們保存在全局變量 *data 中
* @param ptr : 分段傳入的數據內容
* @param size : 每個數據塊字節數,一般爲1
* @param nitems : 數據塊數
* @param buf :這裏使用, 正常情況下, 傳入的參數是:用於數據增量保存的指針
* @return
*/
size_t on_read_http_data(void *ptr, size_t size, size_t nitems, void *buf) {
// 注意:這裏傳入的 ptr,不能當成 char* 直接處理,而是當成普通數組進行處理
size_t bytes = size * nitems;
// 數組擴容函數,第二個參數:需要增加的字節
// 使用realloc函數簡化了這些步驟,把原內存空間的指針ptr傳給realloc,通過參數size指定新的大小(字節數),realloc返回新內存空間的首地址,
// 並釋放原內存空間, realloc不負責清零
data = realloc(data, bytes);
// 複製增量數據
memcpy(data + data_size, ptr, bytes);
// 數據長度更新
data_size += bytes;
// 本次處理字節量
return bytes;
}
int main() {
CURL *curl;
CURLcode res;
// 天氣預報
char *url = "https://v0.yiketianqi.com/api?unescape=1&version=v91&appid=43656176&appsecret=I42og6Lm&ext=&cityid=&city=蘇州";
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
// 讀取socket數據,分觸發多次 函數調用
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, on_read_http_data);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
// 此時 *data 是不包含'\0'結尾的數據, 這裏需要重建一個數組
// calloc負責把這塊內存空間用字節0填充,而malloc並不負責把分配的內存空間清零
char * out = calloc(1, data_size + 1);
// 複製 *data 到新 char*數組
memcpy(out, data, data_size);
printf("out: %s", out);
free(data);
free(out);
return 0;
}