⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_62717.htm

📁 vc
💻 HTM
字号:
<p>
序号:62717 发表者:mwh 发表日期:2003-11-28 11:18:31
<br>主题:套接字问题2
<br>内容:我写了一个客户端程序,使用CSocket异步运行程序如下,在对端服务器中断连接后,OnClose()响应启动定时器2,每隔一段时间尝试重新连接,直至超过规定次数:<BR><BR>......................<BR><BR>BOOL CGzxfDlg::Createsocket()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_setup.getdata();<BR>&nbsp;&nbsp;&nbsp;&nbsp;cti.sin_addr.s_addr = inet_addr(m_setup.m_data.m_servaddr);<BR>&nbsp;&nbsp;&nbsp;&nbsp;cti.sin_family=AF_INET;<BR>&nbsp;&nbsp;&nbsp;&nbsp;cti.sin_port=htons(m_setup.m_data.m_port);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!(m_srvsocket = new CMysocket))&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_srvsocket-&gt;SetParent(this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!(m_srvsocket-&gt;Create()))&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_srvsocket-&gt;AsyncSelect(FD_READ|FD_CLOSE|FD_CONNECT);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!(m_socketfile = new CSocketFile(m_srvsocket))) return FALSE; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!(m_Rxarch =new CArchive(m_socketfile,CArchive::load))) return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!(m_Txarch =new CArchive(m_socketfile,CArchive::store))) return FALSE;<BR>}<BR><BR><BR>void CGzxfDlg::OnClose() <BR>{<BR>&nbsp;&nbsp;SetTimer(2,10000,NULL);<BR>&nbsp;&nbsp;Createsocket();<BR>&nbsp;&nbsp;socketclose=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标记网络已中断<BR>}<BR><BR>void CGzxfDlg::OnTimer(UINT nIDEvent) <BR>{<BR>&nbsp;&nbsp;switch (nIDEvent)<BR>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;case 2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Concount++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Concount&gt;100)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddItem(m_messpage.count++,&#34;无法连接服务器,请稍后再试&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_connect.EnableWindow(TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_close.EnableWindow(TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_disconnect.EnableWindow(FALSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_srvsocket-&gt;Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Concount=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KillTimer(2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!m_srvsocket-&gt;Connect((sockaddr*)&amp; cti,sizeof(cti)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddItem(m_messpage.count++,&#34;正在尝试重新连接服务器,请稍后&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接成功<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddItem(m_messpage.count++,&#34;服务器连接成功&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socketclose=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //网络中断恢复连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;CDialog::OnTimer(nIDEvent);<BR>}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;原先我没有在OnClose()中添加 Createsocket()(创建套接字),在OnTimer()每次重连均无法成功,添加后即成功;<BR>&nbsp;&nbsp; 问题是:<BR>&nbsp;&nbsp; OnClose()函数应只是事件通知,难道还会自动关闭套接字并释放资源?如不是,那当OnClose()事件通知到达后在原有套接字即内存资源未释放的情况下,再次操作Createsocket()(创建套接字并分配内存),是否会造成内存泄露问题?<BR>请各位高手指教。<BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:zzjhsj 回复日期:2003-11-28 11:34:49
<br>内容:建议在 CreateSocket 的函数中所有申请内存的地方用如下格式:<BR> <BR> if(pmem)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete pmem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pmem=NULL;<BR>&nbsp;&nbsp;}<BR><BR> pmem = new MEMTYPE;<BR><BR>否则,有泄漏问题<BR><BR>////////////////////////<BR>或者添加另一个成员函数来释放资源
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -