libcurl之curl_easy_getinfo的使用教程

Curl(C++)使用教程 1、Curl简介 2、Easy interface 3、Multi interface 1、Curl简介 libcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP,... 阅读详情

执行结果


代码


// getinfo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include "curl/curl.h"
#pragma comment(lib, "curllib.lib")

//回调函数
size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p)
{
	FILE *fp = (FILE *)user_p;
	size_t return_size = fwrite(buffer, size, nmemb, fp);
	//cout << (char *)buffer << endl;
	return return_size;
}

void print_cookies(CURL *curl)
{
	CURLcode res;
	struct curl_slist *cookies;
	struct curl_slist *nc;
	int i;

	printf("Cookies, curl knows:\n");
	res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
	if (res != CURLE_OK) {
		fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
		exit(1);
	}
	nc = cookies, i = 1;
	while (nc) {
		printf("[%d]: %s\n", i, nc->data);
		nc = nc->next;
		i++;
	}
	if (i == 1) {
		printf("(none)\n");
	}
	curl_slist_free_all(cookies);
}

int _tmain(int argc, _TCHAR* argv[])
{
	// 初始化libcurl
	CURLcode return_code;
	return_code = curl_global_init(CURL_GLOBAL_WIN32);
	if (CURLE_OK != return_code)
	{
		cerr << "init libcurl failed." << endl;
		return -1;
	}

	// 获取easy handle
	CURL *easy_handle = curl_easy_init();
	if (NULL == easy_handle)
	{
		cerr << "get a easy handle failed." << endl;
		curl_global_cleanup(); 
		return -1;
	}

	FILE *fp = fopen("data.html", "ab+");
	char *url = "http://blog.csdn.com/php_fly";	
	//char *url = "http://www.csdn.com";	

	// 设置easy handle属性
	curl_easy_setopt(easy_handle, CURLOPT_URL, url);
	curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);
	
	// curl_easy_setopt(easy_handle, CURLOPT_VERBOSE, 1L);
	//curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */

	//fp:回调函数的参数
	curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);

	// 执行数据请求
	return_code = curl_easy_perform(easy_handle);
	if (return_code != CURLE_OK)
	{
		printf( "Failed to get '%s' [%s]\n",url, return_code);
		return 0;
	}

	//////////////////////////////////////////////////////////////////////////
	int totalTime = 0;
	return_code = curl_easy_getinfo(easy_handle,CURLINFO_TOTAL_TIME,&totalTime);
	if((CURLE_OK==return_code) && totalTime)
		cout<<"耗时:"<<totalTime<<endl;
	
	long downLength = 0;
	return_code = curl_easy_getinfo(easy_handle,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&downLength);
	if((CURLE_OK==return_code) && downLength)
		cout<<"下载的文件大小:"<<downLength<<endl;	
	
	long retcode = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &retcode); 
	if((CURLE_OK==return_code) && retcode)
		cout<<"状态码:"<<retcode<<endl;

	char *contentType={0};
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_CONTENT_TYPE , &contentType); 
	if((CURLE_OK==return_code) && contentType)
		cout<<"请求的文件类型:"<<contentType<<endl;	

	//输出cookie信息
	print_cookies(easy_handle);

	long filetime = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_FILETIME , &filetime); 
	if((CURLE_OK==return_code) && filetime)
		cout<<"远程获取文档的时间:"<<filetime<<endl;
	
	long namelookuptime = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_NAMELOOKUP_TIME , &namelookuptime);
	if((CURLE_OK==return_code) && namelookuptime)
		cout<<"名称解析所消耗的时间:"<<namelookuptime<<""<<endl;	

	long requestSize = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_REQUEST_SIZE , &requestSize);
	if((CURLE_OK==return_code) && requestSize)
		cout<<"请求头大小:"<<requestSize<<"字节"<<endl;

	long headerSize = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_HEADER_SIZE , &headerSize);
	if((CURLE_OK==return_code) && headerSize)
		cout<<"响应头大小:"<<headerSize<<"字节"<<endl;
	
	//获取URL重定向地址
	curl_easy_setopt(easy_handle, CURLOPT_FOLLOWLOCATION, true);
	char* redirectUrl = {0};
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_REDIRECT_URL , &redirectUrl);
	if((CURLE_OK==return_code) && redirectUrl)
		cout<<"URL重定向地址:"<<redirectUrl<<endl;
	else
		cout<<"URL重定向地址:"<<NULL<<endl;

	char *ipAddress={0};
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_PRIMARY_IP,&ipAddress);
	if((CURLE_OK==return_code) && ipAddress)
		cout<<"请求的服务器IP:"<<ipAddress<<endl;

	long downloadSpeed = 0;
	return_code = curl_easy_getinfo(easy_handle, CURLINFO_SPEED_DOWNLOAD , &downloadSpeed);
	if((CURLE_OK==return_code) && downloadSpeed)
		printf("平均下载速度: %0.3f kb/s.\n", downloadSpeed/ 1024);	
	//////////////////////////////////////////////////////////////////////////

	// 释放资源
	fclose(fp);
	curl_easy_cleanup(easy_handle);
	curl_global_cleanup();
	getchar();
	return 0;
}

版权

原文地址: 曾是土木人

使用libcurl进行文件下载类项目开发(一) libcurl简单使用介绍 引言:     由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源库libcurl. 于是就把libcurl的使用研究了一遍, 有些心得, 并解决了一些网友的阻塞卡死问题, 于是jwisp将经验和方案分享给大家.   一共四篇: 使用libcurl进行文件下载类项目开发(一) libcurl简单使用介绍 (二)使用libc 阅读详情

相关推荐

使用libcurl库进行HTTP的下载

由于这段时间需要进行跨平台的代码处理,以前写的很多代码都没办法用了.以前用的是win的WinInet库进行HTTP上传和下载的,在Linux下肯定无法使用了,而我又对socket这些东西不是很了解,只能找一些第三方的跨平台库来使用了.不知道出于啥原因,选择了libcurl.然后花了数天时间来了解这个库有关上传下载的东西,可能我的搜索水平有限吧,直到这两天才真正找到一些可供参考的东西.当然我也试着阅读了libcurl的官方文档,但很无奈,英文水平太差,读完后还是不知道该怎么用.先贴三个对此次学习帮助最大的三个

gjy1606的专栏 9775

curl_easy_getinfo() -- 从 curl 句柄里获得附加信息

curl_easy_getinfo() 函数原型声明如下: #include <curl/curl.h> CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); 使用该函数可以在请求求 curl 会话中的相关信息。注意,第 3 个参数必须是一个...

weixin_30325487的博客 1028

Windows环境下安装使用curl命令

curl命令网络应用curl命令是一个利用URL规则在命令行下工作的文件传输工具。CURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

xiangzhihong8的专栏 7063

libcurl入门之相关接口函数curl_easy_getinfo

名称 curl_easy_getinfo 原型 #include <curl/curl.h> CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... ); 描述 使用这个函数从curl会话请求内部信息。第三个参数必须是一个long变量,一个指向char *的指针,一个指向struct curl_slist *指针或者一个指向double的指针(就像本文档下面将要描述的那样)。当这个函数返回CURL_OK时,这个被指向的数据会

专注嵌入式领域 4306

【UE5】【蓝图】 LevelSequence 动画播放与暂停

最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。

UE5开发备忘录 1万+

手把手教你用Matlab为PMSM电流环设计2P2Z补偿器(附与PI对比)

本文详细介绍了如何使用Matlab的controlSystemDesigner工具为永磁同步电机(PMSM)电流环设计2P2Z补偿器,并与传统PI控制器进行性能对比。通过频域分析和时域仿真,展示了2P2Z补偿器在提升带宽、减少超调等方面的优势,为高性能伺服驱动和精密运动控制提供了实用解决方案。

weixin_42551227的博客 379

curl安装

curl安装

huaweichenai的博客 1万+

STM407ZET6+OV5640调试心得

最近一个项目用了STMF407ZET6 +OV5640,调试了好几天做些总结; STMF407ZET6 开发板用的是正点原子的开发板,OV5640摄像头用的是秉火摄像头; 这其中有一个大坑,开发板的DCMI接口跟摄像头的接口不一样,要重新用杜邦线进行连接; 本人是在正点原子的“”15,ATK-OV5640摄像头模块“”源码上进行修改的。

kingseacjh的专栏 8325

libcurl

ios开发之libcurl库的编译详细教程 - 优快云博客 build-libcurl-ios源码编译 - 简书 iOS开发之libcurl库的使用 - 优快云博客 libcurl - curl_easy_getinfo() 使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间 获取站点的各类响应时间 – 运维生存时间 libcurl 基本使用 - RodYang -...

weixin_30399797的博客 81

MC1496乘法器AM调制电路搭建全流程(附Multisim 14.0仿真文件)

本文提供了基于MC1496乘法器搭建AM调制电路的完整实战指南。针对仿真模型缺失的痛点,详细讲解了从晶体管级手动构建MC1496等效模型,到外围电路设计、调制度参数计算与调节,并在Multisim 14.0中进行仿真验证的全流程。通过深度剖析MC1496内部原理与AM信号调制机制,帮助读者获得从仿真到实践的可控设计与排错能力。

weixin_29190169的博客 593

Surface Go 2 变身 Linux 开发本:保姆级 Ubuntu 20.04 双系统安装与驱动配置全攻略

本文详细介绍了如何将 Surface Go 2 变身为高效的 Linux 开发本,涵盖 Ubuntu 20.04 双系统安装、专用内核配置、驱动优化等全流程。通过 linux-surface 内核安装和硬件驱动优化,确保 Surface Go 2 的触控、笔输入、摄像头等功能完美运行,适合开发者打造便携生产力工具。

weixin_30596165的博客 616

libcurl中curl_easy_setopt()和curl_easy_perform()函数使用中文详解

原:http://blog.sina.com.cn/s/blog_7e0127220100zfbf.html libcurl里主要用到的函数有curl_easy_init(),curl_easy_setopt()和curl_easy_perform(). 顾名思义,curl_easy_init()是用来初始化libcurl库的(不知道对不对,就这么理解吧), curl_easy_seto

wonder 2万+

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4171

libcurl常用函数-curl_global_init-curl_easy_init-curl_easy_setopt-curl_easy_perform-curl_easy_cleanup介绍

2.curl_easy_init - 启动 libcurl 简单会话 3.curl_easy_setopt - 设置 curl 简单句柄的选项 4.curl_easy_perform - 执行阻塞文件传输 5.curl_easy_getinfo - 从 curl 句柄中提取信息 6.curl_easy_cleanup - 结束 libcurl 简单句柄 7.作者答疑 如有疑问,敬请留言。...

插件开发 3714

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

libcurl 信息提取指南:curl_easy_getinfo 全选项详解与源码实现剖析

`curl_easy_getinfo` 是 libcurl 提供的"结果读取"接口,负责在一次传输完成后,从 CURL 句柄中提取诸如响应码、各阶段耗时、实际 URL、传输字节数、TLS 会话信息等 60 余项运行数据。本文以 curl 仓库官方手册 [docs/libcurl/curl_easy_getinfo.md](https://link.gitcode.com/i/1e8506f4441

gitblog_00825的博客 370

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

curl_easy_cleanup 完全指南:libcurl 句柄释放、资源回收与正确使用边界

`curl_easy_cleanup` 是 libcurl 中负责销毁 easy 句柄(handle)的核心清理函数,与 `curl_easy_init` 一一对应,是任何基于 libcurl 的传输程序在结束传输后必须调用的收尾 API。本文以 [docs/libcurl/curl_easy_cleanup.md](https://link.gitcode.com/i/2c515fa2cda96

gitblog_00701的博客 1017

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

libcurl 调用curl_easy_getinfo( ) 返回错误码对照

//执行设置好的操作 res = curl_easy_perform(easy_handle); //获取HTTP错误码 long HTTP_flag = 0; curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &amp;HTTP_flag); curl_getinfo...

weixin_33802505的博客 4279

Libcurl简明使用指南

Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。 http://curl.haxx.se/libcurl/ 从http://curl.haxx.se/libcurl/ 下载一个稳定的

把握自己。 3282

libcurl简单用法

当操作完成时,这个调用必须有一个对应的curl_easy_cleanup调用。当应用程序不再使用libcurl的时候,应该调用curl_global_cleanup[声明:void curl_global_cleanup(void)]释放相关的资源。//在curl_easy_init和所有curl_easy_setopt调用完成后调用此函数,并将按照选项中的描述执行传输.curl_slist_free_all() 释放使用 curl_slist_append() 制作的整个 curl_slist。

两只机械佬 的博客 1537

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

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

weixin_34405332的博客 1082

libcurl - curl_easy_getinfo - 从 curl 句柄中提取信息 - 可用信息

可以提取以下信息: CURLINFO_EFFECTIVE_METHOD 最后使用的 HTTP 方法。见CURLINFO_EFFECTIVE_METHOD CURLINFO_EFFECTIVE_URL 上次使用的网址。见CURLINFO_EFFECTIVE_URL CURLINFO_RESPONSE_CODE 最后收到的响应代码。见CURLINFO_RESPONSE_CODE CURLINFO_REFERER 推荐人标头。见CURLINFO_REFERER CURLINFO_HTTP_CONNECTCODE

插件开发 1836

curl_easy_recv 完全指南:基于 libcurl 连接只读模式实现自定义协议的原始数据接收

`curl_easy_recv()` 是 libcurl 为开发者提供的“原始连接数据接收”接口:在 `CURLOPT_CONNECT_ONLY` 建立连接后,它允许你绕过 libcurl 的内置协议处理,直接从已建立的连接上读取裸数据。它与配套的 `curl_easy_send()` 一起,构成了在 libcurl 之上实现自定义协议、或者与代理 / SSL/TLS 隧道结合做底层数据交换的官方

gitblog_01023的博客 658
上一篇: [VC]使用内存映射技术对文件进行倒序
下一篇: 最全的libcurl库资源整理
曾是土木人
博客等级 码龄15年 67粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值