none
wininet中HTTP如何不使用已经存在的连接 RRS feed

  • 问题

  • 使用wininet实现http数据的访问,服务器是XP中的IIS。程序的功能是使用GET方式访问自己编写的.net2.0 aspx页面。调试中发现对资源的多次请求使用同一个tcp连接,我想每次资源访问后关闭连接,下次访问资源在重新连接。
    程序中尝试了使用HTTP1.0,但是似乎无效,抓数据包显示请求的还是http1.1。在xp sp3系统下,安装ie6和ie8是同样的结果。搜索到的结果一般都是如何使用wininet进行保持连接的访问,是不是wininet只能使用保持连接的方式了?
    测试代码如下:
    DWORD TestHTTPGet()
    {
     HINTERNET hInternet = NULL;
     HINTERNET hHTTPSession = NULL;
     HINTERNET hHTTPFile = NULL;
     CHAR ErrMsg[1024] = {0};
     DWORD ErrCode = 0;
     BOOL bRet = FALSE;
    
    
     CHAR* QueryBuf = NULL;
     DWORD QueryBufLen = 0;
    
     int i = 2;
     while (i--)
     {
      __try
      {
       hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT,
        NULL, NULL, NULL);
    
       if (NULL == hInternet)
       {
        ErrCode = GetLastError();
        __leave;
       }
       
    
       hHTTPSession = InternetConnect(hInternet, "192.168.0.2", HTTP_PORT, NULL, NULL,
        INTERNET_SERVICE_HTTP, NULL, NULL);
       if (NULL == hHTTPSession)
       {
        ErrCode = GetLastError();
        __leave;
       }
    
       
    
       hHTTPFile = HttpOpenRequest(hHTTPSession, "GET", "/testget.aspx", "HTTP/1.0", NULL, NULL,
        INTERNET_FLAG_RELOAD, NULL);
       if (NULL == hHTTPFile)
       {
        ErrCode = GetLastError();
        __leave;
       }
    
       
       bRet = HttpSendRequest(hHTTPFile, NULL, 0, NULL, 0);
       if (!bRet)
       {
        ErrCode = GetLastError();
        __leave;
       }
       
       DWORD ResponseStatusCode = 0;
       QueryBufLen = sizeof(ResponseStatusCode);
       bRet = HttpQueryInfo(hHTTPFile, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &ResponseStatusCode, &QueryBufLen, NULL);
       if (!bRet)
       {
        ErrCode = GetLastError();
        __leave;
       }
    
       if (HTTP_STATUS_OK != ResponseStatusCode)
       {
        if (0 == ErrCode )
        {
         ErrCode = 1;
        }
       }
      }
      __finally
      {
    
       if (NULL != hHTTPFile)
       {
        InternetCloseHandle(hHTTPFile);
       }
    
    
       if (NULL != hHTTPSession)
       {
        InternetCloseHandle(hHTTPSession);
       }
    
       if (NULL != hInternet)
       {
        InternetCloseHandle(hInternet);
       }
     }
     }
    
     
     return ErrCode;
    }
    2009年4月2日 9:02

答案

  • 断开连接
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2009年4月2日 9:20
    版主
  • InternetSetOption INTERNET_OPTION_END_BROWSER_SESSION看看
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    2009年6月21日 14:18
    版主

全部回复

  • 断开连接
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2009年4月2日 9:20
    版主
  • 能释放的都释放了,还有什么可以断开?
    2009年4月2日 14:08
  • InternetSetOption INTERNET_OPTION_END_BROWSER_SESSION看看
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    2009年6月21日 14:18
    版主
  • 不好意思,帮朋友向Shen Jiang版主提个和InternetSetOption有关的问题,和楼主的问题可能无关:

     

    请教一下,我朋友用WinInet封装HTTP尝试连接同一个服务器,当多次请求(HttpSendRequest)和断开请求(InternetCloseHandle)之后,继续连接服务器在HttpSendRequest发送请求时就会超时(错误码:12002),INTERNET_OPTION_MAX_CONNS_PER_SERVER 线程标志我已经修改为100,HTTPOpenRequest设置的也是INTERNET_FLAG_RELOAD强制重新连接了,出现这种问题是否是WinInet还需要设置其它的参数或者技巧?设置INTERNET_OPTION_MAX_CONNS_PER_SERVER和INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER的调用,InternetSetOption函数没有返回false,但是实际上似乎没有改变最大连接的效果。请教一下可能是什么原因引起的?或者是否有更多需要设置的地方?

     

    PS:我用WinSock2封装HTTP的话就不会出现以上情况。为了方便快捷兼容HTTPS和一些HTTP 1.1特性所以才用WinInet的。

    2011年3月11日 4:14