网络传输文件端点续传丢包解决方案,大家看看!

huaguli 2007-08-31 03:32:14
比如服务器要传一个文件给我(通过udp),如果该文件是100M,而传输时是按1k一个包发送,需要发1024*100个包,我现在要做断点续传,请问用什么办法记录我哪些包已经收齐了(要考虑丢包),哪些包还没收。做个临时二进制文件记录?还是怎么?怎么做会比较快呢?

我现在的想法是这样的:服务器发给我的每个包的包头都有整个文件包的个数,当前包的序列号,还有是否为最后一个包的标志位,我这边将收到的包按包的序列号移动文件指针写入对应的位置(SetFilePointer),同时也写一记录表(二进制文件,为一1024*100(包个数)字节,初始化全置为0,来一个包就将其对应号置1),如果收到结束标志包,就启动一线程遍历记录表,将不为1的包号发给服务器要求重发,直到所有标志都为1就判断为收完全。然后将记录文件删除。
如果中途断掉(意外情况,关机等),则就是要断点续传了,则下次再下载时先读取临时文件,遍历每个字节,如果不为1的就把其位置发给服务器要求重发。

请问这样行不行呢?有没有更好的方法或改进?谢谢了!
...全文
359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
还没淹死的鱼 2009-03-10
  • 打赏
  • 举报
回复
同意5楼

一直停留在想法中,尚未付诸行动
Caten 2009-03-10
  • 打赏
  • 举报
回复
基本方案是这样做。
1。可以多点传输,比如5线程传输,这时将文件分成5等份(你的最小粒度为1K,如果小于1K则只开启一个即可),取得各分块的偏移,开启线程,向SERVER请求各自偏移的数据。
2。已下载数据的记录,记录到一个临时二进制文件即可,记录各块的已下载状态,初始值全为0,FLASHGET即是如此。

注意点:
1.此时分块后各线程都有各自的区域,下完一个区域后重新规划区域重复前面的过程,重新进行区域分配,这样可以减少记录信息的遍历及线程的同步处理过程。

2.数据写盘时最好有缓冲过程,比如1M后写盘(同时要考虑当前连续块下完后就直接写盘,否则偏移信息会出问题)
huaguli 2007-09-03
  • 打赏
  • 举报
回复
huaguli 2007-09-03
  • 打赏
  • 举报
回复
huaguli 2007-09-03
  • 打赏
  • 举报
回复
怎么没人回答啊
vcPlayer 2007-08-31
  • 打赏
  • 举报
回复
可行。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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