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