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

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