问题简介:在尝试使用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协议的时候就出现了这个问题。请教看雪各位大牛,帮忙看下是怎么回事。感激不尽。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)