linux 下 libcurl 库的使用

来源:互联网 发布:淘宝卖大牌瑕疵化妆品 编辑:程序博客网 时间:2024/05/18 02:18

libcurl 库的使用

libcurl主要功能就是用不同的协议连接和沟通不同的服务器。
libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。
libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。

1 、 源码下载

https://github.com/curl/curl

2、编译安装

#./configure –enable-shared –enable-static –prefix=/usr/local/

#make

#make install

3、查看

# curl -V
curl 7.50.2 (x86_64-pc-linux-gnu) libcurl/7.50.2 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

4、代码测试


main.hpp

#ifndef main_hpp#define main_hpp#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>#define ERROR_LOG(fmt,args...) {printf("\n[%s(line:%d)]:" fmt,__FILE__, __LINE__,##args);fflush(stdout);}#define DEBUG_LOG(fmt,args...)  {printf("\n[%s(line:%d)%ld]:" fmt,__FILE__, __LINE__,time(NULL),##args);fflush(stdout);}#define WARNING_LOG(fmt,args...)  {printf("\n[%s(line:%d)]:" fmt,__FILE__, __LINE__,##args);fflush(stdout);}#define TRACE_LOG(fmt,args...)  {printf("\n[%s(line:%d)]:" fmt,__FILE__, __LINE__,##args);fflush(stdout);}#define INFO_LOG(fmt,args...)  {printf("\n[%s(line:%d)]:" fmt,__FILE__, __LINE__,##args);fflush(stdout);}#endif

main.cpp

#include"main.hpp"#include"curlDownload.hpp"int main(int argc, char **argv){ if (argc != 3) {    ERROR_LOG("input command param error");   return -1; } curlDownload mydownload; mydownload.download(argv[1],0,argv[2]); return 0;}

curlDownload.hpp

////  curlDownload.hpp//  ////  Created by jianjian Qi on 9/9/16.//  Copyright © 2016 tgbtgb. All rights reserved.//#ifndef curlDownload_hpp#define curlDownload_hpp#include <stdio.h>#include <curl/curl.h>#include "main.hpp"static size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);class curlDownload{ friend size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);public:  int download(char * sourceUrl, long long totalSize, char * saveFile);private:  char szSourceUrl[1024];  char szSaveFile[1024];  FILE * fp;  long long llCurrentSize;  long long llTotoalSize;  CURL *curl;};#endif /* curlDownload_hpp */

curlDownload.cpp

////  curlDownload.cpp//  ////  Created by jianjian Qi on 9/9/16.//  Copyright © 2016 tgbtgb. All rights reserved.//#include "curlDownload.hpp"size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata){  if (userdata == NULL)  {    ERROR_LOG("write_callback userdata error");    return -1;  }  curlDownload * download = (curlDownload *)userdata;  size_t res = fwrite(ptr, size, nmemb, download->fp);  if (res <= 0)  {    ERROR_LOG("[%s] write(%lld) faild@%s",download->szSourceUrl,download->llCurrentSize,strerror(errno));    return -1;  }  download->llCurrentSize += res;  return res;}int curlDownload::download(char * sourceUrl, long long totalSize, char * saveFile){  CURLcode res;  int ret = -1;  fp      = NULL;  llCurrentSize = 0;  llTotoalSize  = totalSize;  memset(szSourceUrl,0,sizeof(szSourceUrl));  memset(szSaveFile,0,sizeof(szSaveFile));  memcpy(szSourceUrl, sourceUrl, strlen(sourceUrl));  memcpy(szSaveFile, saveFile, strlen(saveFile));  do  {    fp = fopen(szSaveFile,"wb");    if (fp == NULL)    {      ERROR_LOG("[%s] open %s faild@%s",szSourceUrl, szSaveFile, strerror(errno));      break;    }    /* get a curl handle */    curl = curl_easy_init();    if (!curl)    {      ERROR_LOG("[%s] curl_easy_init error@%s",szSourceUrl,curl_easy_strerror(res));      break;    }    res = curl_easy_setopt(curl, CURLOPT_URL, szSourceUrl);    if (CURLE_OK != res)    {      ERROR_LOG("[%s] CURLOPT_URL error@%s",szSourceUrl,curl_easy_strerror(res));      break;    }    res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);    if (CURLE_OK != res)    {      ERROR_LOG("[%s] CURLOPT_WRITEFUNCTION error@%s",szSourceUrl,curl_easy_strerror(res));      break;    }    res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);    if (CURLE_OK != res)    {      ERROR_LOG("[%s] CURLOPT_WRITEDATA error@%s",szSourceUrl,curl_easy_strerror(res));      break;    }    res = curl_easy_perform(curl);    if (CURLE_OK != res)    {      ERROR_LOG("[%s] curl_easy_perform error@%s",szSourceUrl,curl_easy_strerror(res));      break;    }    /* download succ */    INFO_LOG("[%s] download succ and save as %s", szSourceUrl, szSaveFile);    ret = 0;  } while(0);  if (fp == NULL)  {    return ret;  }  fclose(fp);  fp = NULL;  if (curl)  {    curl_easy_cleanup(curl);    curl = NULL;  }  return ret;}

5、编译

#g++ main.cpp curlDownload.cpp -lcurl

6、测试

#./a.out https://github.com/curl/curl/archive/master.zip master.zip

参考网址:https://curl.haxx.se/libcurl/c/

0 0