[急]http多线程下载的问题中CHttpFile::SendRequest()的问题

winkyz 2006-04-04 11:10:31
要实现HTTP多线程下载功能, 设计让每个线程都独自创建CInternetSession,CHttpConnection,CHttpFile对象,利用 CHttpFile::SendRequest() 发送http头时 ,发现一个奇怪现象:就是只能正常启动两个线程,第三个以后的线程都卡在了SendRequest() 这里,而且就算是单个线程里面执行三次SendRequest()也卡住了,不知道是什么原因.是不是下面什么参数设置错了
CInternetSession m_InternetSession(NULL,1,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
pHTTP=m_InternetSession.GetHttpConnection(strServer,0,nPort,NULL,NULL);
pF=pHTTP->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,NULL,1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT |INTERNET_FLAG_NO_AUTO_REDIRECT|INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE);

请高手赐教
...全文
624 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
winkyz 2006-04-05
  • 打赏
  • 举报
回复
试了,好像不是这个问题,应该是其他问题
wangk 2006-04-05
  • 打赏
  • 举报
回复
用InternetSetOption设置INTERNET_OPTION_MAX_CONNS_PER_SERVER
winkyz 2006-04-05
  • 打赏
  • 举报
回复
To sdf123321()
不是你说的这样的,不是因为网络不好的原因,任何时候一直是两个线程,经过测试是服务器拒绝响应了,两个线程下载时我用ie开同个网站的网页是开不了的,只有在我正在下载的线程数小于两个的时候才能打开页面。说明有某种特定的资源在线程结束前没有释放,而其他与该服务器的连接在等待这个资源造成的。代码如下:
strValidURL.MakeLower();
if(strValidURL.Find("http://")<0)
{
strValidURL="http://"+strValidURL;
}
strValidURL.SpanExcluding("#");
if (!AfxParseURL((LPCTSTR) strValidURL,dwServiceType,strServer,strObject,nPort))
{
bResult = 4;
//AfxMessageBox("AfxParseURL出错了");
threadDescInfo[id]+="\n错误:无效的URL地址!";
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);
break;
}
pHTTP=m_InternetSession.GetHttpConnection(strServer,0,nPort,NULL,NULL);
pF=pHTTP->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,
NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT |INTERNET_FLAG_NO_AUTO_REDIRECT|
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);

strHeaders = _T("GET " + strObject + " HTTP/1.1");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

strHeaders = _T("Host: " + strServer);
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

strHeaders = _T("Accept: */*");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

strHeaders = _T("User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

if(strHeaderRange!="")
{
pF->AddRequestHeaders(strHeaderRange);
threadDescInfo[id]+="\n"+strHeaderRange;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);
}
strHeaders = _T("Pragma: no-cache");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

strHeaders = _T("Cache-Control: no-cache");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);

strHeaders = _T("Connection: close");
pF->AddRequestHeaders(strHeaders);
threadDescInfo[id]+="\n"+strHeaders;
PostMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,m_idInTaskList<<16|IDO_THREAD_REFLASH,id);
//AfxMessageBox("开始SendRequest");
pF->SendRequest(); //////////////////////////////////////第三个以后线程都等待在这里了
DWORD dwStatusCode;
//AfxMessageBox("开始获取StatusCode");
pF->QueryInfoStatusCode(dwStatusCode);
sdf123321 2006-04-05
  • 打赏
  • 举报
回复
阻塞函数肯定会卡的,即使是单线程也会卡的,还要在另外的线程检测这个线程有没有卡,有的话关闭句柄从新来过。
卡的频繁次数与网络状况有些关系,网络比较差时卡的次数明显增多
MSDN3000 2006-04-05
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=448
sdf123321 2006-04-05
  • 打赏
  • 举报
回复
SendRequest()正常情况下都是有可能阻塞的,用过它提交短信给移动的WEB短信服务器,偶尔都会卡的,不过次数比较少,另外你可以换一个网速快一点的WEB服务器测试一下看一下是否你程序有问题。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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