设为首页 加入收藏

TOP

WinInet多线程下载器编写历程(2)(二)
2014-11-23 20:26:42 】 浏览:870
Tags:WinInet 线程 下载 编写 历程

CString header(GetRangeHeader(pParm->range1,pParm->range2));
AfxMessageBox(header);
if(!httpfile->AddRequestHeaders(header))
{
DWORD errcode = GetLastError();
CString errmsg;
errmsg.Format(_T("添加头失败!%d"),errcode);
AfxMessageBox(errmsg);
}

httpfile->Read(slicebuffer.GetBuffer(len),len);
slicebuffer.ReleaseBuffer();
//AfxMessageBox(slicebuffer);
WaitForSingleObject(pParm->mutex_progress,100);
//写入任务
pthis->m_localfile->Seek(pParm->range1,CFile::begin);
pthis->m_localfile->Write(slicebuffer,len);

ReleaseMutex(pParm->mutex_progress);

ReleaseSemaphore(pParm->semaphore_threads,1,NULL);
delete lpParam;
return 0;
}

CString CDingHttpDownload::GetRangeHeader(UINT range1,UINT range2)
{
CString header;
header.AppendFormat(_T("Range: bytes=%d-%d\r\n"),range1,range2-1);
return header;
}

这段代码问题就多了

1.通过添加request头的Range标识来实现断点下载,但是只有前5个线程(一次性最多5个线程)可以添加头成功,后面5个线程会添加失败

错误代码是12155 即ERROR_HTTP_HEADER_ALREADY_EXISTS

The header could not be added because it already exists.
可是我明明每个线程都是重新连接的。
我目前的想法是:CSession在创建是有一个名字字符串,我怀疑问题在这里。

2.我httpfile read得到的串貌似并不是我指定范围的,而且连原始数据的任意一部分也不是,我猜测可能是编码问题
3.WaitForSingleObject(pParm->mutex_progress,INFINITE) 会一直等待,我是为了调试将INFINITE改为100
我查了一下,貌似不同线程之间 使用mutex 需要设置一些安全设置。。

希望大牛看到以上问题可以指点一二~
摘自 New Day New Plan 。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇图解VC添加自定义消息 下一篇VC+ADO 连接ACCESS和SQL SERVER的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目