VC断点续传注意的几点

来源:互联网 发布:婚姻知乎 编辑:程序博客网 时间:2024/05/17 02:34

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个字节开始的数据写入到文件






原创粉丝点击