VC断点续传注意的几点

1、保存断点值。以便下一次传输时使用,在设计HTTP请求头时直接使用,如下面的dwDownloadSize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 填充信息头
strSend  = L "GET " + strObject + L " HTTP/1.1\r\n";
strSend += L "Host: " + strServer + L "\r\n";
strSend += L "Accept: */*\r\n";
strSend += L "Pragma: no-cache\r\n"
strSend += L "Cache-Control: no-cache\r\n";
if( !m_strReferer.IsEmpty() )
    strSend += L "Referer: " + strReferer + L "\r\n";
strSend += L "Connection: close\r\n";
// Range字段,断点续传的关键
strRange.Format(_T( "Range: bytes=%d-\r\n"), dwDownloadSize);   // dwDownloadSize 就是断点值   
if(m_bSupportResume)
    strSend += strRange;
    
//必须要加一个空行,否则Http服务器将不会应答
strSend += L "\r\n";
2、再次传输文件时,需要将文件指针移动到已下载过的值之后,如:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 打开文件(已存在的.sp临时文件)
CFile DLoadFile;
CFileException ex;
if(DLoadFile.Open(pfileDLoadInfo->tempFile, CFile::modeWrite, &ex))
{
     //DLoadFile.SeekToEnd();
    DLoadFile.Seek(pfileDLoadInfo->dwDownloadSize, CFile::begin);  
}
else
{
    TCHAR szError[ 1024];
    ex.GetErrorMessage(szError,  1024);
    CString strerr;
    strerr.Format(_T( "不能打开文件.sp临时文件\r\n错误是 %s"), szError);
    AfxMessageBox(strerr);

     //DLoadFile.Close();
     return - 1;
}
这里 DLoadFile.Seek(pfileDLoadInfo->dwDownloadSize, CFile::begin);  负责将文件指针移到断点处。

3、每一次请求HTTP连接时,接收的数据都应该减掉应答头。(断点续传每次连接都要减去),如:

1
2
3
4
5
6
7
// 接收第一个响应包
CHAR szReadBuf[BUFFERSIZE];
DWORD dwFirstData = pSocket.Receive(szReadBuf, BUFFERSIZE);
int n = GetHeadLength(szReadBuf);    // 获得应答头的长度
m_dwDownloadSize = dwFirstData-n;    // 除去应答头后的数据长度
// 第一次写入数据
DLoadFile.Write(szReadBuf+n, m_dwDownloadSize);   // 从第n个字节开始的数据写入到文件






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值