首页 > 编程语言 >以下是一个使用C++实现HTTP文件下载的简单示例,其中使用了C++ 11的标准库和Boost库:

以下是一个使用C++实现HTTP文件下载的简单示例,其中使用了C++ 11的标准库和Boost库:

时间:2023-03-20 14:03:15浏览次数:36  
标签:11 std stream 示例 read asio C++ boost response

#include <iostream>
#include <fstream>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main()
{
try
{
boost::asio::io_service io_service;

//获取URL信息和协议类型
tcp::resolver resolver(io_service);
tcp::resolver::query query("www.example.com", "http");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

//连接到服务器
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);

//构造HTTP请求消息
boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET /index.html HTTP/1.0\r\n";
request_stream << "Host: www.example.com\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";

//发送HTTP请求消息
boost::asio::write(socket, request);

//读取HTTP响应消息
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");

//检查响应是否正常
std::istream response_stream(&response);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);

if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
std::cout << "无效响应\n";
return 1;
}

if (status_code != 200)
{
std::cout << "请求错误, 状态码: " << status_code << "\n";
return 1;
}

//处理 HTTP 响应消息体
boost::asio::read_until(socket, response, "\r\n\r\n");

//找到Content-Length
std::string header;
while (std::getline(response_stream, header) && header != "\r")
{
if (header.find("Content-Length: ") == 0)
{
long long content_length = std::stoll(header.substr(16));
std::cout << "文件大小为: " << content_length << " bytes.\n";

//读取文件内容并写入本地文件
std::ofstream output_file("example.html", std::ios::binary);
if (!output_file)
{
std::cout << "无法创建文件!\n";
return 1;
}
std::vector<char> buffer(1024*1024); //使用1MB缓冲区
long long bytes_read = 0;
while (bytes_read < content_length)
{
long long read_length = std::min((long long)buffer.size(), content_length - bytes_read);
boost::asio::read(socket, boost::asio::buffer(buffer.data(), read_length));
output_file.write(buffer.data(), read_length);
bytes_read += read_length;
}
std::cout << "文件下载完成!\n";
break;
}
}
}
catch (std::exception& e)
{
std::cout << "下载错误: " << e.what() << "\n";
return 1;
}

return 0;
}

该程序会连接到“www.example.com”网站,请求“index.html”文件,在本地文件系统中保存该文件。可以根据实际需要修改相应的URL和文件名。



标签:11,std,stream,示例,read,asio,C++,boost,response
From: https://blog.51cto.com/xiaohaiwa/6132724

相关文章

  • c语言http文件下载断点续传示例(libcurl)
    以下是C语言实现HTTP文件下载的断点续传示例代码。假设要下载的文件URL为​​http://example.com/example.zip,本地保存为​​example.zip。#include<stdio.h>#incl......
  • win11 如何设置 通知区域始终显示所有图标
    点击“搜索”,输入cmd,选择“以管理员身份运行  在弹窗里面输入以下代码,打开传统的通知区域图标管理器explorershell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}......
  • c++环境
    目录环境准备下装安装vscode及插件安装mingw编译器工作环境准备vscode工作目录调试环境CSDN参考文档环境准备下装安装vscode及插件vscode是微软账号登录的插件配置信息......
  • [C++引用] 保定丽丽带你学C++
    引用是C++内一个比较有用的方法,大家在丽丽的带领下好好学习。一.引用的基本使用C++引用的作用:给变量起别名语法:​​数据类型&名字=原名​​示例:#include<iostream>usi......
  • C++重载
    返回值不能作为重载的依据intfun()const;intfun();常成员函数可以用于重载无法重载的情况voidfun(inta);voidfun(constinta);普通值传递和const传递无法......
  • C++ 读写ini文件
    #include<Windows.h>#include<string>classIniFile{public:IniFile(conststd::wstring&path):m_path(path){}std::wstringGetValue(conststd::wstring&......
  • C++ map用法总结(整理)
    C++map用法总结(整理)1,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(valu......
  • SNP Glue™2211通过Rise with SAP S/4HANA®Cloud集成认证
    德国SNP公司——SAP生态环境中先进的数字化转型、自动化数据迁移、数据管理软件供应商。于2023年3月3日宣布,其软件产品SNPGlue2211已通过SAP®认证,与RISEwithSAPS/4HAN......
  • Vue插件:Vue-resource github搜索示例
     1:安装插件  vue-resourcevue的插件库,在vue1.0年代使用几率很高......
  • vscode中使用#include<bits/stdc++.h>报错,已解决.
    最近使用vscode写c++代码时,使用万能头文件#include<bits/stdc++.h>居然报错了。在网上查找资料时,看到一个大佬的评论,最终顺利解决。方案如下:将鼠标停留在错误波浪线处,点......