linux 下 libcurl 库的使用
2016-09-10 18:27
232 查看
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/curl2、编译安装
#./configure –enable-shared –enable-static –prefix=/usr/local/#make
#make install
3、查看
# curl -Vcurl 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 -lcurl6、测试
#./a.out https://github.com/curl/curl/archive/master.zip master.zip参考网址:https://curl.haxx.se/libcurl/c/
相关文章推荐
- 使用libcurl 编写Linux下Http客户端
- libcurl 静态编译及初步使用(Linux环境)
- 在Linux下使用NDK把libcurl移植到android平台的过程
- linux下编译安装libcurl(附使用示例)
- linux下编译安装libcurl(附使用示例)
- 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)
- libcurl 使用说明和网页抓取 linux下的curl编程
- libcurl的使用(windows下和linux下)
- linux下编译安装libcurl(附使用示例)
- linux下c语言使用libcurl和实现文件上传
- linux下使用libcurl
- 使用 netfilter/iptables 为 Linux(内核 2.4.x )配置防火墙
- 使用增强安全性的Linux(转)
- Linux使用手册[2004年5月28日 14:15]
- 使用 Linux 替代 Windows NT/2000 服务器
- 在Linux下使用ADSL
- java直接使用ttf字体,解决window和linux之间的差异
- linux下使用脚本启动和关闭oracle
- 在Linux下安装和使用MySQL