精英盒子 -> 程序设计 -> [C  ]多线程下载的一点笔记 [打印本页]

墨阐 2012-02-03 16:16

[C  ]多线程下载的一点笔记

rt.
以一个数组存所有任务结构.
任务结构:

  1. typedef struct taskinfo{
    char url[512];
    char path[256];
    float completed;
    int status;
    long filelen;
    int nthreads;
    int blocklen;
    HANDLE hthread[128];
    }taskinfo;

首先用HTTP HEAD获取文件长度:

  1. HEAD filename HTTP/1.1\r\n
    /*其他必须域…*/

返回响应头Content-Length即为文件长度int file_len.
根据自定义线程数nThreads计算分块数据大小blocklen:
  1. blocklen = ceil( file_len / nThreads );

每个分块的请求头,使用socket发送到服务器HTTP端口:

  1. char threadheader =
    "GET filename HTTP/1.1\r\n"
    "range:bytes=" threadid*blocklen "-" blocklen "\r\n"
    "/*其他必须域*/"

然后send过去,recv传输内容.
每个线程fseek临时文件到threadid*blocklen处,写入长度为blocklen的内容,然后fclose.
一点笔记,完整代码在我笔记本上.还是手写的- -||

jybox 2012-02-03 16:17
用api实现的?

jybox 2012-02-03 16:24
其实我还是不懂多线程下载是怎么回事

难道http可以分片来下载?

墨阐 2012-02-03 16:35
#2#3  可以在请求头使用Range:bytes={起始}-{结束}来指定下载范围.
#1用纯socket,发送请求头,回应头和内容要后天回去测试

内容来自[手机版]

墨阐 2012-02-03 16:38
另外多线程这块,还是晕……知道了pthread,没用过,心里有点发毛……

内容来自[手机版]

jybox 2012-02-03 18:17
墨阐:#2#3  可以在请求头使用Range:bytes={起始}-{结束}来指定下载范围.
#1用纯socket,发送请求头,回应头和内容要后天回去测试
内容来自[手机版]  (2012-02-03 16:35) 

好吧,长见识了....

多线程我有用Qt还好




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.039872 second(s),query:5 Gzip enabled