基于原生c++代码实现的Http下载程序

C++:Http协议下载文件(附完整源码) 阅读详情

目录

一、gitHub地址

二、功能

三、目前存在的问题

四、界面效果

五、主要代码


前天用Qt做了一个Http下载工具,但是使用的是Qt的ApI进行开发。所以顺便用纯c++撸了一个,造几个轮子试试效果。

目前基本实现主要功能,但是暂时没有提供断点续传和Https的url下载。只支持对Http的url进行下载。

一、gitHub地址

二、功能

可以输入Http的url进行在线下载。

三、目前存在的问题

暂时没有提供对Https的url下载。

四、界面效果

 

五、主要代码

解析url的ip地址:

void Http::getTcpConfig(const std::string &url)
{
	char domain[100] = { 0 };
	char target[100] = { 0 };
	char port[10] = { 0 };
	char Ip[20] = { 0 };

	parseUrl(m_url, domain, target, port);	//解析url
	getIp(domain, Ip);		//获取ip
	m_ip = Ip;
	m_port = port;
	m_target = target;

	std::cout << "m_ip=" << m_ip << std::endl;
	std::cout << "m_port=" << m_port << std::endl;
}

 

发出get请求:

void Http::getFileRequest()
{
	getTcpConfig(m_url);

	std::cout << "start request......................." << endl;
	if (m_tcp.tcpIsOpen())	//如果是连接状态 关闭重新连接
	{
		m_tcp.tcpClose();
	}
	if (!m_tcp.tcpConnect(m_ip, m_port))
	{
		std::cout << "网络连接失败!" << endl;
		return;
	}
		
	//接收响应头
	char recvBuf[3096] = { 0 };

	std::stringstream request;
	request << "GET " << m_url << " HTTP/1.1\r\n";
	request << "Host: " << m_ip << ":" << m_port << "\r\n";
	request << "Connection:close\r\n";
	request << "\r\n";
	//std::cout << "request = " << request.str().c_str() << std::endl;

	//发送请求头
	int ret = m_tcp.tcpWrite(request.str().c_str(), sizeof(request));
	if (-1 == ret)
	{
		m_tcp.tcpClose();
		return;
	}
	else if (sizeof(request) == ret)
	{
		int ret = m_tcp.tcpRead(recvBuf, sizeof(recvBuf));
		if (-1 == ret)
		{
			m_tcp.tcpClose();
			return;
		}
	}
	//std::cout << "recvBuf = " << recvBuf << std::endl;
	if (std::string(recvBuf).empty())
	{
		std::cout << "网络异常!"<< std::endl;
		return;
	}
	std::string responStr(recvBuf);
	int position = responStr.find("\r\n\r\n");
	if (position != -1)
	{
		position = position + 4;
		memset(m_firstBuf, 0, sizeof(m_firstBuf));
		m_fRecvByte = 0;
		for (int i = position; i < sizeof(recvBuf) / sizeof(char); i++)
		{
			m_firstBuf[m_fRecvByte++] = recvBuf[i];
		}
		if (std::string(m_firstBuf).empty())
		{
			m_fRecvByte = 0;
		}
	}

	//获取返回的状态码
	int code = 0;
	//返回字符串recvBuf中第一次出现子串HTTP/的地址
	char *strPos = strstr(recvBuf, "HTTP/");
	if (strPos)
	{
		sscanf(strPos, "%*s %d", &code);
	}
	strPos = strstr(recvBuf, "Content-Length");
	if (strPos)
	{
		sscanf(strPos, "%*s %d", &m_fileLength);
	}

	if (code == 200)	//直接下载
	{
		downloadFile(m_fileName);
	}
	else if (code == 302)	//重定向
	{
		//获取转调地址
		strPos = strstr(recvBuf, "Location");
		std::string newUrl = std::string(strPos);
		int pos = newUrl.find_first_of(":") + 2;
		newUrl = newUrl.substr(pos, newUrl.find("\r\n") - pos);
		setUrl(newUrl);
		getFileRequest();
	}
	else
	{
		std::cout << "网络错误 " << code <<endl;
		return;
	}
}

进行下载:

void Http::downloadFile(const std::string &m_path)
{
	std::cout << "start download......................." << endl;

	if (m_bkptResume)	//是否打开断点续传
	{
		std::stringstream request;
		request << "GET " << m_url << " HTTP/1.1\r\n";
		request << "Host:" << m_ip << ":" << m_port << "\r\n";
		request << "Range: bytes=" << m_currentDownByte << "-\r\n";
		request << "Connection:close\r\n";
		request << "\r\n";

		//std::cout << "request = " << request.str().c_str() << std::endl;
		int ret = m_tcp.tcpWrite(request.str().c_str(), sizeof(request));
		if (-1 == ret)
		{
			m_tcp.tcpClose();
			return;
		}
	}

	//创建文件
	//FILE *fp = NULL;
	//fp = fopen(m_fileName.c_str(), "wb");
	m_fileName = m_url.substr(m_url.find_last_of("/") + 1, m_url.size());
	m_file.open(m_path, std::ios::out 
		| std::ios::trunc | std::ios::binary);	//写入
	int bytes = 0;
	int total = m_fileLength / (1024 * 1024);
	const int wBufLength = 1024 * 1024 * 2;	//2M
	//char *writeBuf = (char*)malloc(sizeof(char)*length);
	m_writeBuf = new char[wBufLength];
	int lastCur = 0;

	if (m_fRecvByte != 0)
	{
		m_file.write(m_firstBuf, m_fRecvByte);
		bytes = bytes + m_fRecvByte;
	}

	while (true)
	{
		memset(m_writeBuf, 0, wBufLength);
		int ret = m_tcp.tcpRead(m_writeBuf, wBufLength);
		if (ret == SOCKET_ERROR)
		{
			std::cout << m_path << "下载错误" << std::endl;
			break;
		}
		else if (ret == 0)
		{
			std::cout <<"网络中断,请重新下载!" << std::endl;
			break;
		}
		//写入文件
		//fwrite(writeBuf, ret, 1, fp);
		m_file.write(m_writeBuf, ret);
			
		bytes += ret;
		int cur = bytes / (1024);
		if (cur == 0)
		{
			std::cout << cur << "k" << "/" << total << "M" << std::endl;
		}
		else if (cur != lastCur)
		{
			lastCur = cur;
			std::cout << cur << "k" << "/" << total << "M" << std::endl;
		}
				
		if (m_fileLength == bytes)
		{
			std::cout << m_path << "下载完毕" << std::endl;
			break;
		}
	}
	//free(writeBuf);
	delete[] m_writeBuf;
	m_writeBuf = NULL;

	//fclose(fp);
	m_tcp.tcpClose();

	m_file.close();
	
}

tcp初始化:

bool Tcp::tcpConnect(const std::string ip, const std::string port)
{
	WORD word = MAKEWORD(2, 2);
	WSADATA ws;
	if (WSAStartup(word, &ws) != 0)
	{
		return false;
	}

	m_sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (m_sockfd == INVALID_SOCKET)
	{
		perror("m_sockfd:");
		return false;
	}

	memset(&m_clientAddr, 0, sizeof(m_clientAddr));
	m_clientAddr.sin_family = AF_INET;
	m_clientAddr.sin_port = htons(std::atoi(port.c_str()));
	inet_pton(AF_INET, ip.c_str(), &m_clientAddr.sin_addr);

	if (INVALID_SOCKET == connect(m_sockfd, (sockaddr*)&m_clientAddr, sizeof(m_clientAddr)))
	{
		perror("connect:");
		return false;
	}
	std::cout << "connect successful..." << std::endl;

	return true;
}

 

 

 

C++异步HTTP下载技术实践 在当今这个互联网技术飞速发展的时代,网络编程成为了计算机专业人员必备的技能之一。C++网络编程,作为网络应用开发中的一种高效实现方式,吸引了众多IT从业者的关注。本章将从宏观角度概述C++网络编程的相关知识,包括网络编程的定义、特点以及在不同网络协议层中的应用。网络编程实际上涉及到不同网络层之间数据的发送、接收、封装和解析。C++作为一种性能优越、控制能力强的语言,在网络编程领域拥有广泛的应用。它不仅可以帮助开发者实现底层协议的封装,也能高效地处理大量并发的网络连接。 阅读详情

相关推荐

C++实现高效HTTP文件下载功能实战

C++ 的异常机制允许我们定义层次化的异常类型,便于精准捕获与差异化处理。protected:public:public:public:优势:继承结构清晰,支持多态捕获;附加错误码便于日志追踪;what()提供人类可读信息;可扩展更多子类(如 ParseError、AuthFailure 等)。使用方式示例:try {

weixin_42668301的博客 847

C++ winhttp 实现文件下载器

本篇内容讲述 C++ winHttp 实现下载器的简单 demo,使用了 WinHttpOpen、WinHttpConnect、WinHttpOpenRequest、WinHttpSendRequest、WinHttpReceiveResponse、WinHttpQueryDataAvailable、WinHttpReadData、WinHttpCloseHandle 等函数。本机环境:VisualStudio 2022 、 Windows10想要完整代码请到文章末尾。

1_bit 的博客 5905

基于C++的简易文件下载程序设计与实现

在现代软件开发中,网络通信已成为不可或缺的一部分,尤其是在实现文件下载、数据同步和远程资源获取等应用场景中。C++作为一种高效且灵活的编程语言,凭借其底层控制能力和丰富的第三方库支持,在网络编程领域占据重要地位。本章系统介绍C++进行网络编程的核心概念,重点围绕套接字(Socket)模型展开,解析TCP/IP协议栈中传输层与应用层的交互机制。通过理解同步阻塞与异步非阻塞I/O的差异,为后续高性能下载器设计提供理论支撑。

weixin_36296444的博客 801

C/C++ 通过HTTP实现文件上传下载

WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持。它包括了一系列的函数,使得 Windows 应用程序能够进行网络通信、处理 HTTP 请求、FTP 操作等。WinInet 提供了一套完整的网络通信工具,使得开发者能够轻松地构建支持网络功能的应用程序,涵盖了从简单的 HTTP 请求到复杂的文件传输等多种网络操作。

微软技术分享 2万+

C++实现HTTP下载(两种方式:WinInet和Socket)

用C++实现的HTTP Web下载,两种方式实现: 1.WinInet(这种方式很简单,但不是很灵活) 2.WinSock(也就是Socket,这种方式有点繁琐,但是可以自定义发送HTTP的报文头和接收响应头,很灵活) 因作者编程水平有限,错误之处,在所难免,欢迎批评指正。

C++ 实现http下载

VS2010运行,调试后启动后点确定就进入http下载,己封成函数,非常方便。可直接拿在其它项目,函数,两个参数,一个下载地址,一个存放路径。

C++ 网络通信实践:cpp-httplib 与 websocketpp 入门指南,轻松实现 HTTP 与 WebSocket 交互

本文介绍 cpp - httplib 和 websocketpp 两个 C++ 库。前者轻量易用,支持 HTTP/HTTPS 客户端和服务端,适用于多种场景;后者遵循 RFC 6455,实现 WebSocket 全双工通信,帮助实现实时应用开发。

羑悻的博客. 3万+

C++实现http/https/ftp文件下载

支持http/https/ftp资源文件,可自定义下载线程。已修复已知Bug。

cpp-http 库的使用

文章目录前言`cpp-http` 库简介`cpp-http` 库使用介绍http 客户端搭建步骤http 服务端搭建步骤`cpp-http` 库示例服务端实现客户端实现参考资料 前言 最近在做的一个项目需要使用到 HTTP 协议,在网上查了很久,也结合了之前学长做的项目,发现 cpp-http 库使用挺多的,所以就边学边做笔记,顺便分享出来(我觉得知识之所以叫知识,就是因为它能被记录并能被传播,为人所知,为人所识)。 我准备把这个学习记录做成一个系列文章,这个系列里面,我会介绍从 HTTP 协议诞生到目前的

三十的南瓜饭的博客 8277

c++写的一个github快速下载器,clone速度可达10M/s

c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个git

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步

m0_52031708的博客 3844

【免费下载】 cpp-httplib: 轻量级、高性能的C++ HTTP/HTTPS客户端和服务器库

cpp-httplib 是一个轻量级且高效的 C++ HTTP/HTTPS 客户端和服务器库。它由 Hideaki Sone(yhirose)开发,并在 MIT 许可下发布。该项目的主要目标是提供一种简单易用的方式,在 C++ 应用程序中实现 HTTP 和 HTTPS 功能。 项目仓库地址: ## 应用场景与功能 cpp-httplib 可用于以下场景: 1. 开发基于 HTTP 或 HT...

gitblog_00086的博客 1万+

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

HTTP协议详解 - 通过C++实现HTTP服务剖析HTTP协议

C/C++程序员一般很少会接触到HTTP服务端的东西,所以对HTTP的理解一般停留在理论。本文章实现通过C++实现了一个http服务,可以通过代码对HTTP协议有更深的理解,并且通过抓包工具对HTTP协议进行更为详细的分析。HTTP(hypertext transport protocol 超文本传输协议):一种无状态的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。

new9232的博客 9795

别再凭感觉选电容了!手把手教你计算电机控制器里的母线电容(附Excel计算工具)

本文详细解析了电机控制器中母线电容的选型方法,从理论计算到工程实践,帮助工程师避免常见误区。通过精确计算纹波电压、电容容量等关键参数,并结合薄膜电容与电解电容的性能对比,提供实用的选型建议。附带的Excel计算工具可快速完成参数计算,适用于工业伺服驱动和电动车电机控制器设计。

weixin_28720573的博客 515

国宇测试盒GH7009 SPI读操作全解析:从接线到代码实现的避坑指南

本文详细解析了国宇GH7009测试盒进行SPI读操作的完整流程与避坑要点。重点阐述了硬件连接中IO2时序控制引脚的关键作用,提供了从接线方案、电源处理到上位机代码实现的实战指南,并针对常见的数据不稳定、特定寄存器读取失败等问题给出了具体解决方案。

dapp9builder的博客 223

cpp-httplib:一个头文件搞定 C++ HTTP 服务与客户端的极简库

如果你在 C++ 项目里需要收发 HTTP 请求,或想给程序加个 Web 接口,cpp-httplib 是个能省下大量时间的选择。它把 HTTP/HTTPS 服务器和客户端都封装在一个 `httplib.h` 头文件里,基于 C++11,无需额外构建系统——把文件拷进工程、`#include` 一下就能编译运行。对新手来说,"从写第一行代码到看到响应"的整个过程,往往不超过几分钟。 ## 项目定

gitblog_00314的博客 842

FPGA以太网开发实战:YT8511 PHY芯片MDIO接口配置全流程(附Verilog代码)

本文详细介绍了FPGA以太网开发中YT8511 PHY芯片MDIO接口的配置全流程,包括MDIO接口技术解析、Verilog状态机设计、核心代码实现细节及实战调试经验。通过提供经过验证的Verilog代码和优化策略,帮助开发者快速掌握以太网PHY芯片配置技术,提升通信系统性能。

weixin_29184371的博客 232

用C++实现HTTP服务器 - Windows平台(开放源代码)

用C++实现HTTP服务器 - Windows平台 软件名: Que's HTTP Server  (点击下载最新版含源代码) 作者: 阙荣文 - Que's C++ Studio    版权说明: 免费,开放源代码,禁止用作商业用途. 日期: 2011.7.8 1

Que's C++ Studio 8万+

新手必看!用FFmpeg一键合并ts文件的5种方法(含Windows/Mac终端命令)

本文详细介绍了使用FFmpeg合并TS视频文件的5种实用方法,涵盖Windows和Mac终端命令操作。从基础安装到进阶技巧,包括处理音频不同步、批量处理多个视频等场景,帮助用户轻松将m3u8分片视频合并为完整mp4文件,提升视频处理效率。

weixin_29065959的博客 557

Unity 之如何使用Pico4u锚点功能实现一个世界锁GameRoot

摘要 空间锚点技术是混合现实(MR)应用的核心,能永久记录虚拟物体的空间位置。文章介绍了在Unity中使用Pico SDK实现空间锚点的完整流程:1)环境配置需安装XR模块和Pico SDK;2)关键操作包括启动空间感知、创建/删除/查询/更新锚点;3)提供了经典应用案例,通过GameRoot节点实现场景固定和锚点同步。源码展示了基于XR交互工具包的锚点抓取与位置更新实现,为MR开发提供了实用参考方案。

TxNet 972

C++ HTTP 库 cpp-httplib:一个头文件搞定 HTTP/HTTPS 服务与请求

cpp-httplib 是一个 C++11 单文件、header-only 的跨平台 HTTP/HTTPS 库,把服务器和客户端装进同一个头文件。如果你想在 C++ 程序里快速加一层 REST 接口,又不想引入整套框架,它就是合适的候选。 ## 把 HTTP 服务装进一个头文件:cpp-httplib 是什么 打个比方:Express 之于 Node.js 是"几行代码起一个网站",cpp-h

gitblog_00041的博客 799

SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem

Linux Ubuntu环境下对SD卡分区(烧写uboot,kernel,及filesystem) 介绍dd命令的使用,SD卡分区、格式化、复制文件等 fdisk命令

weixin_42408707的博客 5056

封装cpp-httplib成dll包,为老项目提供http网络支持

公司内某些老的项目不支持https或者http1.1的一些新功能,需要开发对应的SDK供其调用,以便维护老项目。

weixin_55229531的博客 5万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++:Http协议下载文件(附带源码)

通过 libcurl,我们能够方便地在 C++ 中实现 HTTP 协议文件下载功能。该方法不仅支持文件下载,还可以扩展支持下载进度显示、HTTP 请求头定制等功能,具有广泛的应用场景。libcurl 是一个功能强大的库,在许多 C++ 项目中都能有效地完成 HTTP 请求任务。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1494

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

包含一个头文件,交付你的 C++ HTTP/HTTPS 服务:cpp-httplib

cpp-httplib 是 C++11 单文件 header-only HTTP/HTTPS 库:包含一个 httplib.h 就拿到服务器与客户端,一个宏开启 HTTPS,跨平台开箱即用。 ## 核心能力速览 cpp-httplib 的技术内核克制、可预期,先列清楚再选型: - 支持 HTTP/1.1 协议,服务器与客户端同库提供 - 阻塞式 socket I/O,内置线程池分发连接 -

gitblog_00531的博客 646

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: Qt实现 Http网络在线下载程序(支持断点续传功能)
下一篇: std::vector容器
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值