Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【求助】Wininet 访问HTTPS时不停创建新的TCP链接

$
0
0
问题简介:在尝试使用Wininet访问HTTPS服务器时,每次调用HttpSendRequest都会产生一个新的链接,即使使用了Connection:Keep-Alive头部也没用。每次都创建一次新的SSL链接大大降低了访问的速度。请教高人,如何使后续的HttpSendRequest请求都采用上一次请求创建的SSL链接?

问题详细描述:
在使用如下代码访问HTTPS服务器时每次调用GetData方法都会创建一个新的SSL链接,发送几个请求之后使用“netstat -ano |find "443"”命令可以发现很多与远程服务器443端口的CLOSE_WAIT信息。
代码如下:
代码:

int HttpsTest::GetData(int Aid,char * Buffer,int BufferLen)
{
        char TempUrl[128]={0};
        sprintf(TempUrl,"/Test.php?Aid=%d",Aid);
        HINTERNET hRequest=HttpOpenRequestA(m_hConnect,"GET",TempUrl,"HTTP/1.1",NULL,NULL, INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID|INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION,NULL);
        if(hRequest==NULL)
        {
                DWORD ErrorCode=GetLastError();
                return false;
        }

      DWORD dwFlags=0;
      DWORD dwBuffLen = sizeof(dwFlags);

      InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS,(LPVOID)&dwFlags, &dwBuffLen);

      dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
      dwFlags |= SECURITY_FLAG_IGNORE_WRONG_USAGE;

      InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS,&dwFlags, sizeof (dwFlags) );

        if(HttpSendRequestA(hRequest,NULL,NULL,NULL,NULL)!=true)
        {
                printf("SendRequestError!!!ErrorCode=%d!!!\r\n",GetLastError());
                InternetCloseHandle(hRequest);
                hRequest=0;
                return false;
        }
        char Buf[1024]={0};
        DWORD BufLen=1024;
        if(HttpQueryInfoA(hRequest,HTTP_QUERY_CONTENT_LENGTH,&Buf,&BufLen,NULL)!=true)
        {
                printf("\r\nHttpQueryInfoError!!!ErrorCode=%d!!!\r\n",GetLastError());
                InternetCloseHandle(hRequest);
                hRequest=0;
                return false;
        }
        DWORD ContentLength=atoi(Buf);

        /////////////////////////////////

        DWORD nRead=0;
        ZeroMemory(Buffer,BufferLen);
        BOOL Ret=InternetReadFile(hRequest,Buffer,BufferLen,&nRead);
        if(Ret && nRead<BufferLen)
        {
                InternetCloseHandle(hRequest);
                MyDataEncode(Buffer,nRead);
                return nRead;
        }
        printf("InternetReadFile Error!!!LastError=%d!!!hRequest=%d\r\n",GetLastError(),hRequest);
        InternetCloseHandle(hRequest);
        return -1;
}

用上面同样的代码去掉HttpOpenRequest方法中INTERNET_FLAG_SECURE标志使用HTTP方式访问服务器的时候则不会出现频繁发起新链接的情况。当添加了INTERNET_FLAG_SECURE标记,使用HTTPS协议的时候就出现了这个问题。请教看雪各位大牛,帮忙看下是怎么回事。感激不尽。

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>