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;
}
网友评论