要实现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);请高手赐教
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);请高手赐教
不是你说的这样的,不是因为网络不好的原因,任何时候一直是两个线程,经过测试是服务器拒绝响应了,两个线程下载时我用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);