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-09-20 01:05:11

libcurl使用示例的相关文章

libcurl中使用curl_easy_getinfo 产生段错误分析

最近再写一个hsf的代理程序.需要使用libcurl与后端的nginx通信.程序编写过程中遇到一个蹊跷的问题. 调用 code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rsp_code); 后会报段错误. 示例代码如下: static int http_proxy(std::string domain, std::string path, std::string params, std::string &rsp_cont, st

curl和libcurl的区别简介

  这篇文章主要介绍了curl和libcurl的区别简介,本文讲解了curl简介.libcurl简介.curl与libcurl对比."curl"的不同意思.PHP中使用curl和libcurl等内容,这么多的curl,搞都搞不懂,看了本文才知道,我们一直用的其实是libcurl,需要的朋友可以参考下 curl简介 curl是利用URL语法在命令行方式下工作的开源文件传输工具. 它支持很多协议:DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMA

curl和libcurl的区别简介_php技巧

curl简介 curl是利用URL语法在命令行方式下工作的开源文件传输工具. 它支持很多协议:DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP. curl同样支持SSL证书,HTTP POST, HTTP PUT,FTP上传,基于表单的HTTP上传,代理(proxies).coo

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

目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密码 十.HTTP验证 十一.代码示例 1.基本的http GET/POST操作 2 获取html网页 3 网页下载保存实例 4 进度条实例显示文件下载进度 5 断点续传实例  

使用libcurl进行文件上传

上篇博文讲到了如何使用multicurl来进行http并发访问,今天继续有关curl的主题,来八一八如何使用curl来上传文件,在介绍具体方法之前了解下目前http文件上传的基本实现.     rfc1867描述了如何使用http协议来上传客户端文件,目前基本上所有的浏览器和web服务器都支持http文件上传,它的使用也十分的简单,具体的来说就是在页面上创建一个form表单,表单的enctype属性为multipart/form-data,action为接收上传文件的cgi url,请求方式为p

使用libcurl实现的上传器

头文件 /*********************************************************************** Copyright (C) 2014 -  - All Rights Reserved** 文件名称:        Uploader_LibCurl.h* 摘    要:        上传器 - LibCurl实现*     * 作    者:        yanglinbo,* 修    改:        查看文件最下方.* ****

使用libcurl实现的下载器

头文件: /*********************************************************************** Copyright (C) 2014 -  - All Rights Reserved** 文件名称:        Downloader_LibCurl.h* 摘    要:        下载器 - LibCurl实现*     * 作    者:        yanglinbo,* 修    改:        查看文件最下方.* *

libcurl教程

原文地址:http://curl.haxx.se/libcurl/c/libcurl-tutorial.html     译者:JGood(http://blog.csdn.net/JGood )     译者注:这是一篇介绍如何使用libcurl的入门教程.文档不是逐字逐句按原文翻译,而是根据笔者对libcurl的理解,参考原文写成.文中用到的一些例子,可能不是出自原文,而是笔者在学习过程中,写的一些示例程序(笔者使用的libcurl版本是:7.19.6).出现在这里主要是为了更好的说明lib

libcurl,多线程,gzip,共享DNS

转载 http://hi.baidu.com/jjxiaoyan/item/e17b9ec3e31b93d4964452d8 libcurl是一个不错的socket库,而且又是开源的.如果仅仅是简单的HTTP请求,那么只需要几行代码就能轻松实现.不过要用libcurl实现高效.高频率的HTTP请求就需要对libcurl有深入的了解才行.如果阅读英文无障碍的话,那么libcurl自带的示例程序和帮助文档就是最好的老师. 一.多线程HTTP请求 libcurl提供多线程和异步请求来实现大批量HTTP