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

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

时间:2023-03-14 18:45:47浏览次数:45  
标签:11 asio 示例 read C++ std length long boost

#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,asio,示例,read,C++,std,length,long,boost
From: https://www.cnblogs.com/xiaohai123/p/17215921.html

相关文章

  • 11.8 消除闪烁(2)(harib08h)
    ps:看书比较急,有错误的地方欢迎指正,不细致的地方我会持续的修改11.8消除闪烁(2)(harib08h)11.7消除闪烁(1)(harib08g)存在的问题:鼠标放在计时器上会有闪烁,产生原因:会先绘制计......
  • C++ 基础部分 个人笔记
    本人菜鸟,个人学习笔记,如有错误还请指教C++模板是什么C++模板是一种基于类型参数化的编程技术,使用模板可以使得程序员编写独立于具体数据类型的通用代码。通过参数化类......
  • P1196 [NOI2002] 银河英雄传说
    有一个30000*N(i)的列队,2种操作1.Mi,j   i行移动到j行的末尾2.Ci,j  询问i行和j行的距离(如果在同一列) #include<bits/stdc++.h>usingnamespacestd;......
  • Windows11 Update
    PCHealthCheck==>BiosTPM2.0isDisabled;OpenmyBios->setting->Security->TrustedComputing->SecurityDeviceSupport->Enabled->f10(savesettings)Search"Win......
  • Insert 插入数据时提示ora-03113错误
    故障现象:下午15:00时,业务反馈业务某张表无法进行数据插入,只要Insert就会提示ora-03113,并将会话直接Kill掉。错误分析:查看alert日志发现有ora-07445的错误ORA-07445:e......
  • 第11章 特殊图
    欧拉图欧拉图的定义欧拉通路(回路):设\(G\)是无孤立结点的无向图或有向图,若存在一条通路(回路),经过图中每边一次且仅一次,则称此通路(回路)为该图的一条欧拉通路(回路).欧拉......
  • win11笔记本插入鼠标关闭触摸板设置
     任务栏空白处右键,选择“任务栏设置”。 找到右侧蓝牙和其他设备,点击触摸板   去掉这个勾 ......
  • C++_一些重要的编译参数
    1.-g编译带调试信息的可执行文件#-g告诉g++产生可供GDB使用的调试信息。g++-gtest.cpp-otest2.-O[n]优化源代码-O:同时减小代码的长度和执行时间,其效果等价于......
  • 【多线程】C++11多线程(简约但不简单) 原创
    【多线程】C++11多线程(简约但不简单) 目录​ ​一、简单使用​​​ ​1、线程参数​​​ ​2.类成员函数做为线程入口​​​ ​3.join:等待线程执......
  • 【LeetCode回溯算法#11】解数独,这次是真的用回溯法处理二维数组
    解数独力扣题目链接(opensnewwindow)编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字1-9在每一行只能出现一次。数字1-9在每一列只......