首页 > 其他分享 >c语言http文件下载断点续传示例(libcurl)

c语言http文件下载断点续传示例(libcurl)

时间:2023-03-15 14:22:05浏览次数:52  
标签:http 示例 libcurl bytes easy handle curl 下载 size

以下是 C 语言实现 HTTP 文件下载的断点续传示例代码。假设要下载的文件 URL 为 http://example.com/example.zip,本地保存为 example.zip。

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

#define LOCAL_FILE_NAME "example.zip"
#define REMOTE_FILE_URL "http://example.com/example.zip"

/* 用于记录已下载的字节数 */
static long long download_bytes = 0;

/* 将下载的数据写入本地文件 */
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    FILE *fp = (FILE *)stream;
    size_t written = fwrite(ptr, size, nmemb, fp);
    download_bytes += written;
    return written;
}

int main(void) {
    CURL *curl_handle;
    FILE *local_fp;
    char range_header[64];

    /* 创建一个 CURL 对象 */
    curl_handle = curl_easy_init();

    /* 打开本地文件,以二进制方式追加写入 */
    local_fp = fopen(LOCAL_FILE_NAME, "ab");
    if (!local_fp) {
        fprintf(stderr, "Error: cannot open file \"%s\"\n", LOCAL_FILE_NAME);
        return 1;
    }

    /* 设置 CURL 的一些参数 */
    curl_easy_setopt(curl_handle, CURLOPT_URL, REMOTE_FILE_URL); // 设置 URL
    curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); // 自动跳转
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); // 设置回调函数
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, local_fp); // 设置回调函数的参数

    /* 如果断点续传,设置 Range 头部信息 */
    if (download_bytes > 0) {
        snprintf(range_header, sizeof(range_header), "Range: bytes=%lld-", download_bytes);
        curl_easy_setopt(curl_handle, CURLOPT_RANGE, range_header);
    }

    /* 执行 HTTP 请求 */
    CURLcode res = curl_easy_perform(curl_handle);

    /* 检查是否出错 */
    if (res != CURLE_OK) {
        fprintf(stderr, "Error: %s\n", curl_easy_strerror(res));
    }

    /* 获取下载的文件大小 */
    double file_size;
    curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &file_size);

    /* 关闭本地文件和 CURL */
    fclose(local_fp);
    curl_easy_cleanup(curl_handle);

    /* 输出下载的结果 */
    if (download_bytes == file_size) {
        printf("Download completed!\n");
    } else if (download_bytes > 0 && download_bytes < file_size) {
        printf("Download interrupted (downloaded %lld bytes, file size is %.0f bytes). Resume downloading...\n", download_bytes, file_size);
        main(); // 递归调用自己以断点续传
    } else {
        printf("Download failed!\n");
    }

    return 0;
}

注意:

在每次下载前,需要读取本地文件大小,判断是否需要进行断点续传(即是否已经下载了一部分文件)。
如果需要进行断点续传,需要设置 Range 头部信息。Range 头部指定从哪个字节开始下载。
在回调函数中,需要记录已下载的字节数,并将下载的数据写入本地文件。注意,在追加写入时,需要使用 "ab" 模式打开本地文件并在最后追加写入。
如果下载未完成(即已下载的字节数小于文件大小),需要递归调用 main() 函数以进行断点续传。

标签:http,示例,libcurl,bytes,easy,handle,curl,下载,size
From: https://www.cnblogs.com/xiaohai123/p/17218372.html

相关文章

  • GET和POST方法的对比、HTTP状态码
    GET和POST方法的对比 1、语义GET:获取数据POST:创建数据2、发送数据GET通过地址在请求头中携带数据携带少量数据,可以使用GET请求,大量的数据可以使用POST请求3、缓存......
  • python-mss 截图简单示例
    python-mss是一个速度非常快的截图和录像工具,支持跨平台,使用纯python语言开发。pipinstallmss截取指定区域并保存为png#encoding=utf-8importmsswithms......
  • 使用socket 和 httpURLConnection发起http请求
    publicstaticvoidtest()throwsException{//http://127.0.0.1:8080/logger/userInetAddressinetAddress=InetAddress.getByName("www.baidu.......
  • HTTP方法
    常用的HTTP方法浏览器发送请求时采用的方法,和响应无关GET、POST、PUT、DELECT用来定义对于资源采取什么样的操作的,有各自的语义HTTP方法的语义增删改查GET获取数据:......
  • 4 HttpServletRequest
    ​ HttpServletRequestHttpServletRequest对象代表客户端浏览器的请求,当客户端浏览器通过HTTP协议访问服务器时,HTTP请求中的所有信息都会被Tomcat所解析并封装在这个对......
  • 4 HttpServletRequest
    ​ HttpServletRequestHttpServletRequest对象代表客户端浏览器的请求,当客户端浏览器通过HTTP协议访问服务器时,HTTP请求中的所有信息都会被Tomcat所解析并封装在这个对......
  • 初识HTTP、HTTP报文
    初识HTTP1、HTTP是什么HyperTextTransferProtocol超文本传输协议HTML:超文本标记语言超文本:原先一个个单一的文本,通过超链接将其联系起来,由原先的单一的文本变成了......
  • 某钉自动打卡示例(仅供学习,不喜勿喷)
    importrequestsimportjson#钉钉API地址和access_token,根据实际情况修改url="https://oapi.dingtalk.com/attendance/v1/advanced/record/create"access_token=......
  • HttpClientUtil
    <!--http请求工具包依赖--><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version></depende......
  • delphi httpserver 使用方法
    unitmain;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,IdBaseComponent,IdContext,IdComponent,IdCusto......