Linux上curl的安装和使用
curl 下载
这个直接在官网上使用wget
下载就可以:
wget --no-check-certificate https://curl.haxx.se/download/curl-7.80.0.tar.gz
curl的安装
- 我们解压下载后的安装包:
tar zxvf curl-7.80.0.tar.gz
- 进入解压后的目录:
cd curl-7.80.0
- 执行配置文件:
./configure
- make:
make
注:这一步可能会报如下的错误:select TLS backend(s) or disable TLS with --without-ssl.
我们在执行配置文件的时候,需要加入如下配置项
./configure --with-wolfssl
sudo make test
sudo make install
curl的使用(C/C++)
curl是一个用C语言开发的库,支持很多网络协议,但是主要使用的还是HTTP协议。
curl的接口分为两大类:easy系列和multi系列。其中easy系列是同步调用;multi系列是异步的多线程调用。
注:
使用g++编译的时候记得链接curl库:-l curl
curl的easy系列
easy系列去收发HTTP数据的接口函数主要有4个:
- curl_easy_init:
这个函数原型如下,其会创建一个curl句柄,这个是其他curl函数要用的。
CURL *curl_easy_init(void);
- curl_easy_setopt:
这个函数原型如下,其会设置各种请求参数,比如请求方法、URL、header/body数据、超时、回调函数等等。
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
- curl_easy_perform:
这个函数的原型如下,其用来发送数据,返回的数据由回调函数处理
CURLcode curl_easy_perform(CURL *curl);
- curl_easy_cleanup:
这个函数的原型如下,这个函数用来清理句柄相关资源,结束会话。
void curl_easy_cleanup(CURL *curl);
下面是个用来收发数据的简短例子:
int main()
{
//创建curl句柄
auto curl_fd = curl_easy_init();
assert(curl_fd);
//设置请求的URL
curl_easy_setopt(curl_fd, CURLOPT_URL, "www.baidu.com");
//发送数据
auto res = curl_easy_perform(curl_fd);
if (res != CURLE_OK)
{
cout << curl_easy_strerror(res) << endl;
}
curl_easy_cleanup(curl_fd);
}
当然,我们还可以设置回调函数,回调函数的原型如下:
/**
* @brief 回调函数
*
* @param recv_data 此次接收到的数据
* @param size 此次接收到的字节数
* @param nmemb 块数
* @param user_buf 出参数据,传出http返回数据,可以用strcat(user_buf,recv_data)收集recv_data的数据。当然用户要定义缓冲区。
* @return size_t
*/
size_t write_callback(char *recv_data, size_t size, size_t nmemb, void *user_buf);
我们通过curl_easy_setopt
绑定一下就好了:
size_t write_callback(char *recv_data, size_t size, size_t nmemb, void *user_buf)
{
cout << "size=" << size << endl;
cout << "recv_data=" << recv_data << endl;
cout << "nmemb=" << nmemb << endl;
return size * nmemb; //返回值必须是这个,否则res != CURLE_OK
}
int main()
{
//创建curl句柄
auto curl_fd = curl_easy_init();
assert(curl_fd);
//设置请求的URL
curl_easy_setopt(curl_fd, CURLOPT_URL, "www.baidu.com");
curl_easy_setopt(curl_fd, CURLOPT_WRITEFUNCTION, &write_callback);
//发送数据
auto res = curl_easy_perform(curl_fd);
if (res != CURLE_OK)
{
cout << curl_easy_strerror(res) << endl;
}
curl_easy_cleanup(curl_fd);
}
注:
write_callback的函数返回值必须为size * nmemb,否则会报错:Failed writing received data to disk/application
参考文献
[1] 罗剑锋.罗剑锋的C++实战笔记.极客时间