客户端编程 VC6.0 wininet http下载文件的关键代码如下:
int retrytimes = 0;
const int MaxRetryTimes = 3;
CInternetSession m_cis;
m_cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5);
CHttpConnection * m_pHttp = m_cis.GetHttpConnection(m_strServer, nPort); DWORD m_dwHttpRequestFlags = HSR_DOWNLOAD | INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT; 
CHttpFile *pFile = NULL;
for (; retrytimes < MaxRetryTimes; retrytimes++)
{
try
{
pFile =  m_pHttp->OpenRequest(CHttpConnection::HTTP_VERB_GET, 
m_strIniPath, NULL, 1, NULL, NULL, m_dwHttpRequestFlags); 
pFile->SendRequest(); 
}   
catch(CInternetException* pEx)
{
if (pEx->m_dwError == 12002) // timeout
{
delete pFile;
pFile = NULL;
pEx->Delete();
Sleep(1000);
continue;
}
TCHAR szError[1024];
pEx->GetErrorMessage(szError,1024);
ERRORRETURN(szError);
}
break; // success!
}

if (retrytimes == MaxRetryTimes || pFile == NULL)
{
ERRORRETURN("重连次数太多");
} CString str;
pFile->QueryInfo(HTTP_QUERY_STATUS_CODE, str);
if (str=="404" || str=="407" || str=="403" || str=="405" || str=="406")
{
ERRORRETURN("无法获取目标");
}
        ........问题描述:如果客户机器上面安装的是IE6,那么客户端程序调用这段代码一般可以正常完成http下载的任务,如果客户机器上面安装的是IE7,则必然出错,函数结束的地方一般都在:ERRORRETURN("重连次数太多");背景知识:怀疑是IE6和IE7所带的系统wininet.dll的版本和表现有不同解决需求:1)如果可以稍微修改代码,怎么样修改代码使得函数可以同时在客户端IE6和IE7下面工作。
          2)如果大家有更优于wininet.dll的组件的其他工具库,能避免对于wininet的依赖的话,也可以算做解决问题的一个方案。问题分数分配:如果有人按照解决需求1解决解决问题,马上获得95%以上的得分,如果没有人按照1需求解决问题,有提供其他替代工具组件的朋友,建议被采纳者获得60%的积分,其他朋友分享40%的分致谢:分数尽是浮云,来者皆是指教,无论哪位朋友给与帮助,在下预先在此致谢。

解决方案 »

  1.   

    INTERNET_OPTION_CONNECT_TIMEOUT参数设置好像是无效的,是个BUG.
    难道IE7里面改过来了?
      

  2.   

    zjh824(coder)
    阁下的意思是不是说:
    m_cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5);
    这句代码,在IE6下面为无效代码
    同时由于IE7的改进的缘故,这句代码的存在使得整个函数在IE7下面无法工作?
    是这样理解吗?
      

  3.   

    http://news.thedigitalmachine.com/2006/04/25/microsofts-shoddy-http-api/
      

  4.   

    我电脑上装的IE7,我没用过WinInet的类来写,都是直接用的API,结果就发现少接收了几行。现在我用的就是winsock,直接自己写HTTP请求,如果楼主有兴趣的话,我可以把我封装的类给发给你,我的Email是[email protected],不过当时为了赶工,我封装的还是简陋了点。
    向楼主推荐个API:URLDownloadToFile,下面是个简单的用法:
    #include <winsock2.h>
    #include <Urlmon.h>
    #pragma comment(lib, "Urlmon.lib")
    #pragma comment(lib, "ws2_32.lib")#include <iostream>
    #include <cstdlib>
    using namespace std;int main()
    {
    WSADATA data;
    ::WSAStartup(0x11, &data); URLDownloadToFile(NULL, "http://www.baidu.com", "c:\\test.html", 0, NULL); WSACleanup(); system("c:\\test.html");
    return 0;
    }
      

  5.   

    还有这事,没有vista不能测试!不过我确实看了下msdn中的变化vs 2003 .net 内
    INTERNET_OPTION_CONNECT_TIME 
    Not currently implemented. vs 2005 中INTERNET_OPTION_CONNECT_TIMEOUT 
    2
    Sets or retrieves an unsigned long integer value that contains the time-out value, in milliseconds, to use for Internet connection requests. Setting this option to infinite (0xFFFFFFFF) will disable this timer.
    If a connection request takes longer than this time-out value, the request is canceled. When attempting to connect to multiple IP addresses for a single host (a multihome host), the timeout limit is cumulative for all of the IP addresses. This option can be used on any HINTERNET handle, including a NULL handle. It is used by InternetQueryOption and InternetSetOption.显然lz的timeout值太小了
    m_cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5);把5该成5000看看吧
      

  6.   

    问题解决了!
    确实是INTERNET_OPTION_CONNECT_TIMEOUT的问题
    zjh824(coder)最先回应,可惜没有说清楚
    CathySun118(斯年) 的链接也证实了这个问题是广泛被确认的
    AlanChenBoy(Alan)的帖子说得最简捷清楚,我就是按这个帖子里面说得,很快找到解决办法的
    hacker931(紫荆) 的解决办法也是不错的,但是按照我们先前的约定,只能给你很少的一点分,不过很感谢你的支持!