1.问题描述

  • 使用libcurl实现下载MP3资源,当本地缓存满了,就停止下载,缓存空出来了,继续开始下载
  • 提供的资源有时候会在下载的时候被拒绝,所以需要断点续传(测试过程中发现的)

2 问题解决方法

下载暂停和继续的方法

    #include <curl/curl.h>
    //该函数可以实现控制播放的停止和下载
    //但是必须要和curl同一个线程中进行控制
    CURLcode curl_easy_pause(CURL *handle, int bitmask );

在查阅一些资料之后,在 CURLOPT_XFERINFOFUNCTION 这个opt设置的回调函数中实现暂停和继续

#include <curl/curl.h>
 
int progress_callback(void *clientp,
                      curl_off_t dltotal,
                      curl_off_t dlnow,
                      curl_off_t ultotal,
                      curl_off_t ulnow)
{
    CURL *curl = (CURL *)clientp;
    if(progress > 90)
    {
        curl_easy_pause(curl, CURLPAUSE_ALL);
    }
    if(progress < 50)
    {
        curl_easy_pause(curl, CURLPAUSE_CONT);
    }
    return 0;
}
 
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFOFUNCTION,
                          progress_callback);


下载过程中被打断的问题

经过和浏览器打开mp3资源文件的比对,发现其中多了这一个http header
range: bytes=0-1048575
http range允许从访问资源的某一个范围
添加代码如下

char range[64] = {0};
snprintf(range, sizeof(range), "%s-", cnt);
CURLcode curl_easy_setopt(curl, CURLOPT_RANGE, range);

其中,range的语法如下
200- 表示访问从200字节开始到末尾的数据
100-n 表示方位从100到n字节的数据