libcurl使用示例

远程下载文件,并将http 头信息存放内存中以及文件大小等相关信息:

 1 #include <stdio.h>
 2 #include <curl/curl.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5
 6 struct MemoryStruct {
 7     char* memory;
 8     size_t allsize;
 9 };
10
11 static size_t WriteMemoryCallback(void* contents, size_t _size, size_t nmemb, void* userp)
12 {
13     size_t realsize = _size * nmemb;
14     struct MemoryStruct *mem = (struct MemoryStruct*)userp;
15
16     mem->memory = (char*)realloc(mem->memory, mem->allsize + realsize + 1);
17     if(mem->memory == NULL){
18         printf("realloc error...\n");
19         return 0;
20     }
21
22     memcpy(&(mem->memory[mem->allsize]), contents, realsize);
23     mem->allsize += realsize;
24     mem->memory[mem->allsize] = 0;
25
26     return realsize;
27 }
28
29
30 size_t write_data(char* buffer, size_t size, size_t items, void* outstream)
31 {
32     int written = fwrite(buffer, size, items, (FILE*)(outstream));
33     return written;
34 }
35
36 double get_download_size(char* url){
37     CURL* curl;
38     CURLcode res;
39     double size = 0.0;
40     int httpcode=0;
41     FILE* fd = fopen("./aaa.txt", "wb+");
42     char *type = (char*)malloc(32);
43     struct MemoryStruct chunk;
44     chunk.memory = (char*)malloc(1);
45     chunk.allsize = 0;
46
47
48
49     curl = curl_easy_init();
50     curl_easy_setopt(curl, CURLOPT_URL, url);
51     //curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
52     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0);    //不跳转
53     curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 3000);
54     curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)fd);
55     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
56
57     curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteMemoryCallback);
58     curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&chunk);
59
60     res = curl_easy_perform(curl);
61     if(res != CURLE_OK){
62         fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
63     }
64     res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
65     if(res != CURLE_OK || httpcode != 200 ){
66         fprintf(stdout, "httpcode error!\n");
67     }
68     res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);
69     if(res != CURLE_OK ){
70         fprintf(stdout, "httpcode xxxerror!\n");
71     }
72
73     res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &type);
74     if(res != CURLE_OK ){
75         fprintf(stdout, "TYPE xxxerror!\n");
76     }
77     printf("type:\n%s\n", type);
78     printf("header:\n%s\n", chunk.memory);
79     fclose(fd);
80     free(chunk.memory);
81     curl_easy_cleanup(curl);
82
83     return size;
84 }
85
86 int main(int argc, char* argv[])
87 {
88     char url[] = "http://www.fastcgi.com/dist/fcgi.tar.gz";
89
90     double filesize = get_download_size(url);
91     printf("[%0.0lf] %s\n", filesize, url);
92     return 0;
93 }
时间: 2024-10-13 10:55:54

libcurl使用示例的相关文章

C/C++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)

C++要实现http网络连接,需要借助第三方库,libcurl使用起来还是很方便的 环境:win32 + vs2015 如果要在Linux下使用,基本同理 1,下载编译libcurl 下载curl源码,找到vs工程,按照x86 x64 并对应debug和release编译出静态库lib 2,构建工程 1)curl头文件和lib拷贝到工程目录 2)配置附加包含目录libcurl中的include和附加库目录libcurl中的lib目录 3)添加预编译宏USE_OPENSSL和CURL_STATIC

使用curl,libcurl访问Https

编译curl,libcurl 下载curl源码(git clone https://github.com/curl/curl),在目录curl\winbuild\BUILD.WINDOWS.txt文件中,详细介绍了使用nmake编译windows下curl及libcurl库的相关命令,摘录如下: nmake /f Makefile.vc mode=<static or dll> <options> where <options> is one or many of: V

C++ 用libcurl库进行http通讯网络编程

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密码 十.HTTP验证 十一.代码示例 1.基本的ht

linux c libcurl的简单使用(转)

curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作.看一个简单的例子: 1 #include <curl/curl.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 CURL *curl; 6 CURLcode res; 7 8 size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 9 { 10 i

qt5集成libcurl实现tftp和ftp的方法一:搭建环境

最近使用QT5做一个软件,要求实现tftp和ftp文件传输,使用QT5开发好UI界面等功能,突然发现QT5不直接提供tftp和ftp支持,无奈之下只好找第三方库来间接实现,根据网友的介绍,libcurl是一个比较小巧好用的网络扩展库,但问题来了,该怎么用呢?折腾了几天,终于在周五晚上别人都下班回家了,我还不甘心的情况下加班找到了解决的方法.现在整理出来,分享给大家,也给自己做个笔记. 首先介绍如何搭建使用环境,这个非常重要,下一篇介绍如何实现文件传输.这涉及到qt5.minGW和libcurl编

libcurl (二)——实例

八.代码示例 1)基本的http GET/POST操作 #include <stdio.h> #include <curl/curl.h> bool getUrl(char *filename) {     CURL *curl;     CURLcode res;     FILE *fp;     if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储         return false;     

libcurl 使用的几个注意事项

0. 为使用的curl url 添加确定的协议头 原文: If you specify URL without protocol:// prefix, curl will attempt to guess what protocol you might want. It will then default to HTTP but try other protocols based on often-used host name prefixes. For example, for host na

HTTP/HTTPS客户端源码示例

HTTP/HTTPS客户端源码示例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2014-04 阅读前提:CMake工具的基本使用.配置openssl-1.0.1g 开发环境 编译zlib库 下载zlib-1.2.8.tar.gz并解压缩到" D:\SDK\zlib-1.2.8",使用CMake工具生成zlib.sln,在Visual Studio2013中打开并编译即可. 编译c

使用libcurl下载文件小例

libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP--一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要讲解一个使用curl下载文件的小例. 首先是去下载curl的最新源代码,然后编译成动态库或者静态库:然后把头文件和库文件拿出来加入到我们自己的工程中,引用声明: #include "curl.h" #ifdef _DEBUG #pragma comment(lib, "../De