InternetOpen循环调用400多次以后,速度明显变慢,是什么原因?

zswzwy 2016-01-20 09:02:11
这时候用浏览器打开网页也很慢,怎么解决?求高人解答!

代码类似这样,用LIBCURL也不行。
HINTERNET hInternet = InternetOpen(_T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"),  
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (NULL == hInternet)
{
return _T("");
}

LONG nPort = 80;
HINTERNET hSession = InternetConnect(hInternet, _T("www.baidu.com"),
(INTERNET_PORT)nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if(hSession == NULL)
{
return _T("");
}

CString sHtmlHeader;
sHtmlHeader = _T("Content-Type: application/x-www-form-urlencoded\r\n");
sHtmlHeader += _T("Accept: */*\r\n");
sHtmlHeader += _T("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0\r\n");
sHtmlHeader += _T("Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
sHtmlHeader += _T("Host: www.baidu.com\r\n");
sHtmlHeader += _T("Referer: ")+strURL;

HINTERNET hRequest = HttpOpenRequest(hSession, _T("GET"), strGetURL,
_T("HTTP/1.1"), _T(""), 0, INTERNET_FLAG_NO_AUTH |
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_CACHE_WRITE, 0);

int iTimeout = 10000;
InternetSetOption(hRequest, INTERNET_OPTION_CONNECT_TIMEOUT,
&iTimeout, sizeof(iTimeout));
InternetSetOption(hRequest, INTERNET_OPTION_SEND_TIMEOUT,
&iTimeout, sizeof(iTimeout));
InternetSetOption(hRequest, INTERNET_OPTION_RECEIVE_TIMEOUT,
&iTimeout, sizeof(iTimeout));
InternetSetOption(hRequest, INTERNET_OPTION_DATA_SEND_TIMEOUT,
&iTimeout, sizeof(iTimeout));
InternetSetOption(hRequest, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,
&iTimeout, sizeof(iTimeout));
InternetSetOption(hRequest, INTERNET_OPTION_LISTEN_TIMEOUT,
&iTimeout, sizeof(iTimeout));

BOOL bResult = HttpSendRequest(hRequest, sHtmlHeader.GetBuffer(),
sHtmlHeader.GetLength(), _T(""), 0);
...全文
1621 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zswzwy 2016-01-20
  • 打赏
  • 举报
回复
@zgl7903 这里确实有问题,但我现在把InternetOpen和InternetConnect改成了成员变量,只初始化一次,问题仍然存在。
zswzwy 2016-01-20
  • 打赏
  • 举报
回复
@bigtree_mfc 没有啊
大树学长 2016-01-20
  • 打赏
  • 举报
回复
有没有内存泄露?
zgl7903 2016-01-20
  • 打赏
  • 举报
回复
个人建议优化一下程序结构 不要多个return, 很明显一个逻辑 if(hSession == NULL) 时 InternetOpen 打开的句柄就泄漏了

BOOL bRet = FALSE;

//变量初始化
HINTERNET hInternet = NULL;
HINTERNET hSession = NULL;
//其它变量

//主过程
do
{
  hInternet = InternetOpen( xxxxx );
  if (NULL == hInternet)  
  { 
   TRACE(XXXXX)
    bRet = -1;
    break;  
  }

  hSession = InternetConnect( xxxxxxx );
  if(hSession == NULL)
  {
    TRACE(XXXXX)
    bRet = -1;
    break; 
  }
 
  …………

  //all done
  bRet = TRUE;  
}while(0);

//结束清理
if(hSession)
{
   InternetCloseHandle( hSession );  hSession = NULL;
}
if(hInternet)
{
   InternetCloseHandle(hInternet );  = NULL;
}
……

return bRet;
zswzwy 2016-01-20
  • 打赏
  • 举报
回复
是不是WINDOWS有什么连接数限制,可是我都调用了InternetCloseHandle啊
赵4老师 2016-01-20
  • 打赏
  • 举报
回复
同意9楼:“网站做了限制”
zswzwy 2016-01-20
  • 打赏
  • 举报
回复
引用 9 楼 oyljerry 的回复:
是不是请求的网站做了限制,然后就是看是不是系统资源比较消耗。 需要两个方面排除
不是,因为HttpSendRequest超时的时候,电脑用浏览器都是上不了网的,程序中断后才恢复上网。
oyljerry 2016-01-20
  • 打赏
  • 举报
回复
是不是请求的网站做了限制,然后就是看是不是系统资源比较消耗。 需要两个方面排除
zswzwy 2016-01-20
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "MaxConnectionsPerServer"=dword:00000040 "MaxConnectionsPer1_0Server"=dword:00000040 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! 搜“GDI泄露检测”
这两个键值改了,没有用
赵4老师 2016-01-20
  • 打赏
  • 举报
回复
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "MaxConnectionsPerServer"=dword:00000040 "MaxConnectionsPer1_0Server"=dword:00000040 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! 搜“GDI泄露检测”

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧