美文网首页
Linux-C-Day4-curl

Linux-C-Day4-curl

作者: 国服最坑开发 | 来源:发表于2023-02-24 15:55 被阅读0次

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

    相关文章

      网友评论

          本文标题:Linux-C-Day4-curl

          本文链接:https://www.haomeiwen.com/subject/cajxldtx.html