关于WININET的问题,有兴趣的进来看看!

perukelzhx 2005-11-30 05:36:04
我有如下一段代码:
**********************************************************************************
CInternetSession MySession("adsl tester", 1, INTERNET_OPEN_TYPE_DIRECT);
CHttpConnection *AdslConnection = 0;
CHttpFile *pHttpFile = 0;

AdslConnection = MySession.GetHttpConnection("192.168.1.1", 80, "admin", "admin");
pHttpFile = (CHttpFile *)MySession.OpenURL("http://192.168.1.1/diag/system.htm");
**********************************************************************************

第一次运行的时候总是没有问题的,第n(n一般是2,3,4,...,7)次运行到该段代码时,
程序就死在
pHttpFile = (CHttpFile *)MySession.OpenURL("http://192.168.1.1/diag/system.htm");
这一句上,pHttpFile的值也不知道是什么,我给MySession设置了连接、发送、接收超时,
但是都没有作用,请高手指点!
...全文
472 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztony007 2006-02-18
  • 打赏
  • 举报
回复
ding
perukelzhx 2005-12-03
  • 打赏
  • 举报
回复
大哥们,帮忙顶一下啊,我的帖子要沉了!!
perukelzhx 2005-12-02
  • 打赏
  • 举报
回复
不然,有更好的方法吗?
iorikingdom 2005-12-02
  • 打赏
  • 举报
回复
MFC的WinInet简直是噩梦,多线程下占用cpu变态地高~~~~
perukelzhx 2005-12-02
  • 打赏
  • 举报
回复
CInternetSession MySession;
CHttpConnection *AdslConnection = 0;
CHttpFile *pHttpFile = 0;
try
{
AdslConnection = MySession.GetHttpConnection("192.168.1.1", 80, "admin", "admin");
pHttpFile = (CHttpFile *)MySession.OpenURL("http://192.168.1.1/diag/system.htm", 1, INTERNET_FLAG_TRANSFER_ASCII, "", 0);
}
catch(CInternetException* pEx)
{
pHttpFile->Close();
AdslConnection->Close();
MySession.Close();

TCHAR szErr[1024];
pEx->GetErrorMessage(szErr, 1024);
AfxMessageBox(szErr);

pEx->Delete();
return 0;
}
**********************************************************
我的程序中访问web页面的代码就是这些,用CHttpConnection::OpenRequest我也试过,结果
一样。我跟进了CInternetSession::OpenURL,在上述代码运行到第60遍的时候,程序在执行完
AfxParseURL成功之后死了,我发现CInternetSession::GetHttpConnection 和 CInternetSession::OpenURL 返回的地址越来越大,应该是内存消耗太大的原因,应该怎样避免
出现这种情况呢 ?

还有,在debug模式运行时,第二次执行 MySession.OpenURL 就死了;而在断点调试时,程序要执行很多次才会死(我是重复了60次才看到程序是怎么死的,真晕了),两者为什么有这样的不同呢?请高手赐教!
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
if(pHttpFile != 0)
{
pHttpFile->Close();
}
if(AdslConnection != 0)
{
AdslConnection->Close();
}
MySession.Close();
delete MySession;
*********************************
经过这样的处理应该释放掉了,再不然,就while(pHttpFile != 0)了。

我先前描述的出错情况不对,实际情况是:调试执行到 openurl 的时候,程序完全死了,
调试信息业看不到,不知道 pHttpFile = (CHttpFile *)MySession.OpenURL("http://192.168.1.1/diag/system.htm"); 返回了什么值

duyhui 2005-12-01
  • 打赏
  • 举报
回复
确保连接都正确释放了.
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
建立会话、建立连接、读取数据、释放连接等都在一个if里面,然后下一次再进if 程序运行的条件跟上一次我看不出有什么不一样,怎么会出现程序可能在第n(n可能是2,3,...,8)次运行时出错的情况,真是郁闷了
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
我断点调试时,程序死了的话,会进入wincore.cpp这个文件,执行一个循环,但那些代码我完全看不懂!
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
第二次运行
AdslConnection = MySession.GetHttpConnection("192.168.1.1", 80, "admin", "admin");
返回一个地址,这个可以看得到,执行到openurl的时候就死了,整个if语句的循环是由一个定时器控制的,这个没有问题,其余代码贴出来的话就太复杂了

hjunxu 2005-12-01
  • 打赏
  • 举报
回复
如果你安装了mfc的源代码,就可以跟踪进去的。
WuOu 2005-12-01
  • 打赏
  • 举报
回复
Mark.
hjunxu 2005-12-01
  • 打赏
  • 举报
回复
只有new了才需要delete的。
还有第二次的时候AdslConnection = MySession.GetHttpConnection("192.168.1.1", 80, "admin", "admin");函数返回了什么啊?你的if和循环在哪里?
hjunxu 2005-12-01
  • 打赏
  • 举报
回复
delete pHttpFile;
delete MySession;
close就好了,不用delete.
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
下面是完整的代码,帮忙看看:
************************************************************************
CInternetSession MySession("adsl tester", 1, INTERNET_OPEN_TYPE_DIRECT);
CHttpConnection *AdslConnection = 0;
CHttpFile *pHttpFile = 0;
CString tmpStr;
char buf[500];
UINT nBytesRead;
try
{
AdslConnection = MySession.GetHttpConnection("192.168.1.1", 80, "admin", "admin");
pHttpFile = (CHttpFile *)MySession.OpenURL("http://192.168.1.1/diag/system.htm");

DWORD dwRet;
pHttpFile->QueryInfoStatusCode(dwRet);
CString s;
s.Format("%d", dwRet);
AfxMessageBox(s);

if(pHttpFile == 0)
{
AfxMessageBox("openurl error");
}
else
{
nBytesRead = pHttpFile->Read(buf, sizeof(buf));
tmpStr = buf;
SoftwareVersion = ReadWebPage(tmpStr, 3, 2);
txtSVersion.SetWindowText(SoftwareVersion);
}
if(pHttpFile != 0)
{
pHttpFile->Close();
delete pHttpFile;
}
if(AdslConnection != 0)
{
AdslConnection->Close();
delete AdslConnection;
}
MySession.Close();
delete MySession;
}
catch(CInternetException* pEx)
{
CString s;
// catch errors from WinINet
TCHAR szErr[1024];
pEx->GetErrorMessage(szErr, 1024);
s.Format("%d", pEx->m_dwError);
AfxMessageBox(s);
AfxMessageBox(szErr);
pEx->Delete();
} // end try...catch
***************************************************************************
etre 2005-12-01
  • 打赏
  • 举报
回复
光看你这些代码看不出啥啊。
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
try catch 捕捉不到这个异常,我贴出的代码后面还有释放连接的代码,这些都在一个if语句里,整个 if语句会循环执行
hjunxu 2005-12-01
  • 打赏
  • 举报
回复
光看你这些代码看不出啥啊。
你是整个这一段代码会被跑n回?还是最后2行?
还有就是加上try catch
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
CSDN越来越牛了!
perukelzhx 2005-12-01
  • 打赏
  • 举报
回复
if(pHttpFile != 0)
pHttpFile->Close();
if(AdslConnection != 0)
AdslConnection->Close();
MySession.Close();
********************************
发现这样处理之后,连接仍然没有断开,但再次执行if的时候,pHttpFile、 AdslConnection 、MySession又初始化了,并不影响后面的代码啊,所以
问题的原因不在于连接是否断开。
加载更多回复(7)

18,356

社区成员

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

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