要实现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);请高手赐教

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=448
      

  2.   

    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);
      

  3.   

    用InternetSetOption设置INTERNET_OPTION_MAX_CONNS_PER_SERVER
      

  4.   

    SendRequest()正常情况下都是有可能阻塞的,用过它提交短信给移动的WEB短信服务器,偶尔都会卡的,不过次数比较少,另外你可以换一个网速快一点的WEB服务器测试一下看一下是否你程序有问题。