转载

libcurl 简单事例

curl 是利用 URL 语法在命令行方式下工作的开源文件传输工具。它被广泛应用在 Unix、多种 Linux 发行版中,并且有 DOS 和 Win32、Win64 下的移植版本。

libcurl 主要功能就是用不同的协议连接和沟通不同的服务器,也就是相当封装了的 sock。

在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时 libcurl 将调用用户的回调函数实现特定功能。下面是利用 libcurl 完成传输任务的流程:

  1. 调用curl_global_init()初始化libcurl
  2. 调用 curl_easy_init()函数得到 easy interface型指针
  3. 调用curl_easy_setopt设置传输选项
  4. 根据curl_easy_setopt设置的传输选项,实现回调函数以完成用户特定任务
  5. 调用curl_easy_perform()函数完成传输任务
  6. 调用curl_easy_cleanup()释放内存

在整过过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它。

下面是使用 libcurl 获取一个 URL 返回数据的简单事例:curldata.cc:

#include <iostream>                                      #include <curl/curl.h> #include <cstring> #include <cstdlib> #include <string> #include <vector> struct url_data {  size_t size;  char* data; }; size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {  size_t n = size * nmemb;  free(data->data);  data->data = (char*) malloc (sizeof(char) * (n + 1));  if(!data->data) {   std::cout << "Failed to allocate memory" << std::endl;   return 0;  }     memcpy(data->data, ptr, n);   data->data[n] = '/0';  return n; } char* handleURL(char* url) {  CURL* curl;  CURLcode res;  struct url_data data;  data.size = 0;  data.data = NULL;  curl = curl_easy_init();  if (curl) {   curl_easy_setopt(curl, CURLOPT_URL, url);   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);   curl_easy_setopt(curl, CURLOPT_WRITEDATA, &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);  }  return data.data;                                       } int main() {  std::vector<std::string> locations;  char url[] = "https://www.baidu.com";  char* data = handleURL(url);  if(!data) {   std::cout << "Curl handle url error" << std::endl;   return 1;  }  std::string str(data);  std::cout << str << std::endl;  return 0; } 

编译:

g++ curldata.cc -o curldata -lcurl

运行:

./curldata

结果截图如下:

libcurl 简单事例

Reference:

The libcurl API

libcurl 百度百科
正文到此结束
Loading...