libcurl使用示例
远程下载文件,并将http 头信息存放内存中以及文件大小等相关信息:
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h> struct MemoryStruct {
char* memory;
size_t allsize;
}; static size_t WriteMemoryCallback(void* contents, size_t _size, size_t nmemb, void* userp)
{
size_t realsize = _size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct*)userp; mem->memory = (char*)realloc(mem->memory, mem->allsize + realsize + );
if(mem->memory == NULL){
printf("realloc error...\n");
return ;
} memcpy(&(mem->memory[mem->allsize]), contents, realsize);
mem->allsize += realsize;
mem->memory[mem->allsize] = ; return realsize;
} size_t write_data(char* buffer, size_t size, size_t items, void* outstream)
{
int written = fwrite(buffer, size, items, (FILE*)(outstream));
return written;
} double get_download_size(char* url){
CURL* curl;
CURLcode res;
double size = 0.0;
int httpcode=;
FILE* fd = fopen("./aaa.txt", "wb+");
char *type = (char*)malloc();
struct MemoryStruct chunk;
chunk.memory = (char*)malloc();
chunk.allsize = ; curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
//curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, ); //不跳转
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, );
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)fd);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&chunk); res = curl_easy_perform(curl);
if(res != CURLE_OK){
fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
}
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
if(res != CURLE_OK || httpcode != ){
fprintf(stdout, "httpcode error!\n");
}
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);
if(res != CURLE_OK ){
fprintf(stdout, "httpcode xxxerror!\n");
} res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &type);
if(res != CURLE_OK ){
fprintf(stdout, "TYPE xxxerror!\n");
}
printf("type:\n%s\n", type);
printf("header:\n%s\n", chunk.memory);
fclose(fd);
free(chunk.memory);
curl_easy_cleanup(curl); return size;
} int main(int argc, char* argv[])
{
char url[] = "http://www.fastcgi.com/dist/fcgi.tar.gz"; double filesize = get_download_size(url);
printf("[%0.0lf] %s\n", filesize, url);
return ;
}
libcurl使用示例的更多相关文章
- libcurl代码示例
http://note.youdao.com/noteshare?id=e60a679d1731c870ff45e403de81a2c0
- 使用curl,libcurl访问Https
编译curl,libcurl 下载curl源码(git clone https://github.com/curl/curl),在目录curl\winbuild\BUILD.WINDOWS.txt文件 ...
- C++ 用libcurl库进行http通讯网络编程
使用libcurl完成http通讯,很方便而且是线程安全,转载一篇比较好的入门文章 转载自 http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724 ...
- C++ 用libcurl库进行http通讯网络编程(转)
转载:http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三. ...
- linux c libcurl的简单使用(转)
curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作.看一个简单的例子: #include <curl/curl.h> #include <std ...
- libcurl
一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用 ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
- C++ 用libcurl库进行http通讯网络编程[转]
http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.cur ...
- C/C++ 用libcurl库进行http通讯网络编程
C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...
随机推荐
- 安装 Archlinux 小记
故事的背景 开始的时候装的 win8 + ubuntu 双系统,但是慢慢感觉只要有 windows 存在,在 Linux 上遇到问题了就想逃回去. 在一次 GDG 的演讲中听到的: 趁现在还年轻,还有 ...
- 一个Windows C++的线程池的实现
此线程池所依赖的线程类,请参看<一个Windows C++的线程类实现>: http://blog.csdn.net/huyiyang2010/archive/2010/08/10/580 ...
- Android studio gradle配置!!!【转】
转自:http://www.open-open.com/lib/view/open1415793464648.html Gradle 基本概念 首先我们学习几个gradle 的脚本语法,掌握了这几个语 ...
- POJ 1182 食物链(并查集拆点)
[题目链接] http://poj.org/problem?id=1182 [题目大意] 草原上有三种物种,分别为A,B,C A吃B,B吃C,C吃A. 1 x y表示x和y是同类,2 x y表示x吃y ...
- [转]Net Framework引路蜂地图开发示例
From:http://www.2cto.com/kf/201207/140421.html 引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台 ...
- Gradient boosting
Gradient boosting gradient boosting 是一种boosting(组合弱学习器得到强学习器)算法中的一种,可以把学习算法(logistic regression,deci ...
- hdu 2768
求最大留下的观众,观众之间存在不能同时满足的关系,就是矛盾关系, 矛盾关系建边,建边是双向的所以最大匹配要/2 还有一种建图的方法:把观众分成两个集合,一个是投留下猫的,一个是投留下狗的 每个集合间没 ...
- 为何与0xff进行与运算
为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = "" ...
- create a (VSTO) Office 2007 add-in using VS 2012?
You can get VS 2012 working with Office 2007. First create an Outlook 2010 Add-In and modify the pro ...
- 在 IIS 中配置 ASP.NET 应用程序
注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...