curl 实现 https、ftp下载文件 代码

这篇具有很好参考价值的文章主要介绍了curl 实现 https、ftp下载文件 代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

cURL 是一个网络数据传输项目,通常说 cURL 是指 curl 命令行工具,它支持 DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、Telnet 与 TFTP 等协议,而 curl 的底层使用的是 libcurl 库,libcurl 与 curl 组成了 cURL 项目。

curl 源码下载 https://curl.se/download.html

下载之后三步:
1.解压
2.进入目录:./configure --with-gnutls (打开tls)
3.make
4.make install

测试命令:

curl -v https://www.baidu.com
curl -V

命令没问题的话我们源码编译安装成功,下面就可以写代码实现了。

https实现下载功能:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

static int download_progress;

struct progress {
   char *private;
   size_t size;
};

typedef struct HTTP_OPT
{
	char url[128];		/*url of https*/
//	char *user_key;		// username:password
	char *file;		/*filepath*/
}HTTP_OPT;


static size_t callback_download_response(void *contents, size_t size, size_t nmemb, void *userp)
{
	size_t realsize = size * nmemb;
	int count = 0;

FILE* fp = (FILE *)userp;
if (!fp) {
	/* out of memory! */
	fprintf(stderr ,"not file to save download data .\n");
	return 0;
}

if(contents && realsize > 0 ) {
	count = fwrite(contents, 1, realsize, fp);
	if (count != realsize) {
		fprintf(stderr, "write file failed, size:%d != write_count:%d\n", realsize, count);
		fflush(fp);
		return 0;
	}
}
fflush(fp);

return realsize;
}

static size_t progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
	int progress = 0;
	progress = (int)(dlnow / dltotal * 100);
	fprintf(stderr, "download progress = %d / 100", progress);
	download_progress = progress;
 
   return 0;
}

int get_download_progress()
{
	return download_progress;
}

CURL *curl_init()          //curl初始化
{
	download_progress = 0;
	curl_global_init(CURL_GLOBAL_DEFAULT); 
	CURL *curl = curl_easy_init();
	if(NULL == curl)
	{
		fprintf(stderr, "Init curl failed.\n");
		exit(1);
	}
	return curl;
}

void curl_deinit(CURL *curl)  //退出curl
{
	curl_easy_cleanup(curl);
	curl_global_cleanup(); 
}

int https_download(const HTTP_OPT http_option)
{

CURL *curl;
struct progress data;

FILE *fp = fopen(http_option.file, "w");
if(NULL == fp)
{
	fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
	return -1;
}

curl = curl_init();

if (curl) {
	CURLcode res;

	curl_easy_setopt(curl, CURLOPT_POST, 0);
	curl_easy_setopt(curl, CURLOPT_URL, http_option.url);

	//跳过证书校验
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

	//6秒未达到30字节会退出
	curl_easy_setopt(curl,CURLOPT_LOW_SPEED_TIME,6L);
	curl_easy_setopt(curl,CURLOPT_LOW_SPEED_LIMIT,30L);

	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_download_response);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

	//获得进度条
//	curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &data);
//	curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);  
//	curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);

	res = curl_easy_perform(curl);

	if (res != CURLE_OK) {
		fprintf(stderr, "curl_easy_perform() failed: %s\n",
			curl_easy_strerror(res));
		//res = curl_easy_getinfo(curl, CURLINFO_HTTP_CODE);
		res = -1;
	}

	fclose(fp);
	curl_deinit(curl);
	return 0;

}
return -1;
}

int download_https(char* addr, char* refile, char* lofile)
{
	HTTP_OPT http_opt;
	sprintf(http_opt.url, "%s%s", addr, refile);
	fprintf(stderr, "http_opt.url = %s\n",http_opt.url);
	http_opt.file = lofile;
	if (https_download(http_opt) != 0) {
		fprintf(stderr, "Download failed.\n");
		return -1;
	} else {
		fprintf(stderr, "Download success.\n");
		return 0;
	}
}

int main()
{
	download_https("https://filesamples.com","/samples/image/bmp/sample_640×426.bmp", "sample_640×426.bmp" );
}

ftp实现下载功能文章来源地址https://www.toymoban.com/news/detail-741609.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


typedef enum FTP_STATE
{
	FTP_UPLOAD_SUCCESS,
	FTP_UPLOAD_FAILED,
	FTP_DOWNLOAD_SUCCESS,
	FTP_DOWNLOAD_FAILED 
}FTP_STATE;
 
typedef struct FTP_OPT
{
	//char *url;		/*url of ftp*/
	char url[80];		/*url of ftp*/
	char *user_key;		/*username:password*/
	char *file;		/*filepath*/
}FTP_OPT;

char _ip_addr[16];//远程主机IP地址

static int get_file_size(FILE *file) //获取文件大小
{
	int size = 0;
	fseek(file, 0L, SEEK_END);
	size = ftell(file);
	fseek(file, 0L, SEEK_SET);
	return size;
}

static int getipaddr(const char* _host)
{
    memset(_ip_addr, 0, 16);
    /*通过域名得到相应的ip地址*/
    struct hostent *host = gethostbyname(_host);//此函数将会访问DNS服务器
    if (!host) {
        fprintf(stderr, "找不到IP地址,请检查DNS服务器!");
        return(-1);
    }

    for (int i = 0; host->h_addr_list[i]; i++) {
        strcpy(_ip_addr, inet_ntoa( * (struct in_addr*) host->h_addr_list[i]));
        break;
    }

if (strlen(_ip_addr) == 0) {
    fprintf(stderr, "错误: 无法获取到远程服务器的IP地址, 请检查下载地址的有效性\n");
    return(-1);
}
return 0;
}

CURL *curl_init()          //curl初始化
{
	curl_global_init(CURL_GLOBAL_DEFAULT); 
	CURL *curl = curl_easy_init();
	if(NULL == curl)
	{
		fprintf(stderr, "Init curl failed.\n");
		exit(1);
	}
	return curl;
}
 
void curl_set_upload_opt(CURL *curl, const char *url, const char *user_key, FILE *file) //设置上传配置参数
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_READDATA, file);	
	curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
	curl_easy_setopt(curl, CURLOPT_INFILESIZE, get_file_size(file));
	curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}
 
void curl_set_download_opt(CURL *curl, const char *url, const char *user_key, FILE *file) //设置下载配置参数
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}
 
void curl_exit(CURL *curl)  //退出curl
{
	curl_easy_cleanup(curl);
	curl_global_cleanup(); 
}
 
CURLcode curl_perform(CURL *curl) //执行curl
{
	CURLcode ret = curl_easy_perform(curl);
	if(ret != 0)
	{
		fprintf(stderr, "Perform curl failed.\n");
		curl_exit(curl);
		exit(1);
	}
	return ret;
}
 
 
FTP_STATE ftp_upload(const FTP_OPT ftp_option) //ftp上传文件
{
	FTP_STATE state;
	CURL *curl;;
	FILE *fp = fopen(ftp_option.file, "r");
	if(NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

curl = curl_init();
curl_set_upload_opt(curl, ftp_option.url, ftp_option.user_key, fp);
if(CURLE_OK == curl_perform(curl))
	state = FTP_UPLOAD_SUCCESS;
else
	state = FTP_UPLOAD_FAILED;

curl_exit(curl);
fclose(fp);
return state;
}
 
FTP_STATE ftp_download(const FTP_OPT ftp_option) // ftp下载文件
{
	FTP_STATE state;
	CURL *curl;
	FILE *fp = fopen(ftp_option.file, "w");
	if(NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

curl = curl_init();
curl_set_download_opt(curl, ftp_option.url, ftp_option.user_key, fp);
if(CURLE_OK == curl_perform(curl))
	state = FTP_DOWNLOAD_SUCCESS;
else
	state = FTP_DOWNLOAD_FAILED;

curl_exit(curl);
fclose(fp);
return state;
}

int download_ftp(char* addr, char* refile, char* lofile)
{

if(getipaddr(addr) < 0)
	return -1;

FTP_OPT ftp_opt;
sprintf(ftp_opt.url, "ftp://%s%s", _ip_addr, refile);
fprintf(stderr, "ftp_opt.url = %s\n",ftp_opt.url);
ftp_opt.file = lofile;	//指下载到本地文件名
ftp_opt.user_key = "anonymous:";
if(FTP_DOWNLOAD_SUCCESS == ftp_download(ftp_opt))
	fprintf(stderr, "Download success.\n");
else
	fprintf(stderr, "Download failed.\n");

return 0;
}

int main()
{
	download_ftp("192.168.5.3","/samples/image/bmp/sample_640×426.bmp", "sample_640×426.bmp" );
}

到了这里,关于curl 实现 https、ftp下载文件 代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 使用FTP上传文件、下载文件,实现数据传输

    上传文件的方法调用: 下载文件方法:

    2024年02月14日
    浏览(48)
  • Java基于ftp协议实现文件的上传和下载

    相比其他协议,如 HTTP 协议,FTP 协议要复杂一些。与一般的 C/S 应用不同点在于一般的C/S 应用程序一般只会建立一个 Socket 连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。 FTP 使用 2 个端口,一个数据

    2024年02月11日
    浏览(49)
  • linux编译curl库(支持https)

    openssl下载和编译 https://www.openssl.org/source/old/ 解压 配置 如果是编译静态库加入 -fPIC no-shared 如果指定安装路径,使用 --prefix=/usr/local/openssl/ 选项指定特定目录 编译和安装 curl下载和编译 https://curl.se/download.html 解压 配置 如果想要编译静态库,加入 --disable-shared 选项 如果需要指

    2024年02月09日
    浏览(41)
  • 【Linux】基于FTP协议实现Linux与Windows文件传输

    基于FTP协议实现Linux与Winodows实现文件传输,是大学期间的一个小实验。在这里做个总结。 实验环境: Linux CentOS 7.9 Xshell 7 Win10 通过yum安装vxftpd pacakge,并按照如下指令执行 修改 vsftpd.conf,此前先备份 成 vsftpd.conf.bak ,防止该配置文件改错导致无法运行。 执行 vim vsftpd.conf ,加

    2024年02月04日
    浏览(50)
  • Linux系统编程,使用C语言实现简单的FTP(服务器/客户端)

    前言 跟着上官社长 陈哥花了一个月的时间终于把Linux系统编程学的差不多了,这一个月真的是头疼啊,各种bug,调的真心心累,不过好在问题都解决掉了,在此也感谢一下答疑老师,给我提供了很多的思路,本文章是对前段时间学习Linux,做一个小小的总结,才疏学浅,只学

    2024年02月12日
    浏览(71)
  • Curl【实例 01】curl下载使用及cmd实例脚本分享(通过请求下载文件)

    Curl 官方下载地址 可下载不同平台不同版本的安装包,本次使用的是Windows解压版本 curl-8.0.1_9-win32-mingw.zip 。 1.1 curl curl是一个开源的命令行工具和库,用于在终端和脚本中进行网络数据传输。它支持多种协议,如HTTP、HTTPS、FTP、SMTP等,可以通过URL进行数据传输和通信。 curl的

    2024年02月07日
    浏览(56)
  • 如何使用curl下载github代码

    首先通过chrome打开想要下载的源文件 如图,有那个下载图标时表示不需要鉴权即可下载,一般仓库都会开放只读权限,所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中,按下F12打开网络,点击下载图标 上图为文件所在位置 使用如下命令进行下

    2024年02月16日
    浏览(37)
  • Java实现minio上传、下载、删除文件,支持https访问

    MinIO 是一款高性能、分布式的对象存储系统,Minio是基于Go语言编写的对象存储服务,适合于存储大容量非结构化的数据,例如图片、音频、视频、备份数据等 , 传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。 导入minio依赖包 application.yml配置文件 配置

    2024年02月05日
    浏览(51)
  • 命令行下载FTP文件

    目录  介绍本次用到的 DOS 命令 1. 打开命令行 2. 进入 FTP 3. 连接 FTP 4. 输入用户名及密码 5. 查看 FTP 文件目录 6. 进入【HIS】文件夹 7. 指定本地文件夹 8. 开关交互模式 9. 下载文件 10. 下载时会有提示 11. 耗时计算         本文旨在说明如何以命令行的方式直接下载 FTP 上的

    2023年04月17日
    浏览(30)
  • 基于curl 使用http多线程下载大文件

    如需完整代码,可评论区留言

    2024年02月04日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包