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++实战笔记.极客时间