Linux-C-Day4-curl

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章