首页
社区
课程
招聘
[求助]Wininet 访问HTTPS时不停创建新的TCP链接
发表于: 2013-12-7 14:45 6143

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

2013-12-7 14:45
6143
问题简介:在尝试使用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协议的时候就出现了这个问题。请教看雪各位大牛,帮忙看下是怎么回事。感激不尽。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
请教...
2013-12-8 13:12
0
游客
登录 | 注册 方可回帖
返回
//