linux c下,基于http的文件下载的断点续传

wangrui007 2010-04-17 10:26:32
我想从服务器上下载一个大文件(基于http协议的下载)用标准c写
怎么能实现断点续传,希望一个完整的源码 。主要是上一次下载(没有下载完)与下载怎么整合到一起成为一个完整的文件,如果使用多线程下载,代码应该怎么写?
...全文
889 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjy88813 2011-07-22
  • 打赏
  • 举报
回复
mark
pure_coder 2010-10-17
  • 打赏
  • 举报
回复
这里有个跨平台的下载库,支持HTTP,FTP,HTTPS,多线程下载,还能在WinCE,Linux,IPhone上跑,你可以参考下
http://www.easygeteasy.com
libin1201119 2010-07-23
  • 打赏
  • 举报
回复
帮顶 坐等解决
阿磊2013 2010-04-18
  • 打赏
  • 举报
回复
帮顶,学习一下。不过我曾看过bt协议,实现的很巧妙,建议去看一下
shiweifu 2010-04-18
  • 打赏
  • 举报
回复
你是不是在因为断点续传而烦恼着呢?告诉你不用了,现在我将详细的从断点续传的原理帮你解决这个问题。

(一)断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:
假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive

服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给Web服务器的时候要多加一条信息--从哪里开始。
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔细看一下就会发现多了一行RANGE: bytes=2000070-;这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。

服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服务器返回的信息比较一下,就会发现增加了一行:
Content-Range=bytes 2000070-106786027/106786028
返回的代码也改为206了,而不再是200了。
知道了以上原理,就可以进行断点续传的编程了。

发的HTTP头中,支持你指定的字节范围。。这下LZ明白了吧
shiweifu 2010-04-18
  • 打赏
  • 举报
回复
下载文件就是CLIENT端先构建个字符串的HTTP头,给服务器发过去
然后服务器给你先发个带大小的HTTP头,接着给你发文件

断点续传如果大文件,我觉得得用到文件映射
spygg 2010-04-18
  • 打赏
  • 举报
回复
路过看下,正学基础……
ForestDB 2010-04-18
  • 打赏
  • 举报
回复
帮顶。
q307742556 2010-04-17
  • 打赏
  • 举报
回复
不 知道怎么搞了
huanmie_09 2010-04-17
  • 打赏
  • 举报
回复
我是来学习的.
do_fork 2010-04-17
  • 打赏
  • 举报
回复
还没学会游泳之前,最好不要尝试横渡长江
wangrui007 2010-04-17
  • 打赏
  • 举报
回复
如果我是多线程下载,重新下载时那怎么处理这个fseek,应该定位什么位置,怎么实现。
hittlle 2010-04-17
  • 打赏
  • 举报
回复
一个简单的思路就是:记下要下载的文件的总字节数,并记下已下载的记节数,重新下载时,先fseek到相应的字节数处,再开始下载;这是最简单的
柯本 2010-04-17
  • 打赏
  • 举报
回复
看一下wget的源码吧,这个不是一句二句就能完成的
http://download.csdn.net/source/536402

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧