📄 subject_62717.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> m_setup.getdata();<BR> cti.sin_addr.s_addr = inet_addr(m_setup.m_data.m_servaddr);<BR> cti.sin_family=AF_INET;<BR> cti.sin_port=htons(m_setup.m_data.m_port);<BR> <BR> if(!(m_srvsocket = new CMysocket)) return FALSE;<BR> m_srvsocket->SetParent(this);<BR> <BR> if(!(m_srvsocket->Create())) return FALSE;<BR> m_srvsocket->AsyncSelect(FD_READ|FD_CLOSE|FD_CONNECT);<BR><BR> if(!(m_socketfile = new CSocketFile(m_srvsocket))) return FALSE; <BR> if(!(m_Rxarch =new CArchive(m_socketfile,CArchive::load))) return FALSE;<BR> if(!(m_Txarch =new CArchive(m_socketfile,CArchive::store))) return FALSE;<BR>}<BR><BR><BR>void CGzxfDlg::OnClose() <BR>{<BR> SetTimer(2,10000,NULL);<BR> Createsocket();<BR> socketclose=1; //标记网络已中断<BR>}<BR><BR>void CGzxfDlg::OnTimer(UINT nIDEvent) <BR>{<BR> switch (nIDEvent)<BR> { case 2:<BR> {<BR> Concount++;<BR> if(Concount>100)<BR> {<BR> AddItem(m_messpage.count++,"无法连接服务器,请稍后再试");<BR> m_connect.EnableWindow(TRUE);<BR> m_close.EnableWindow(TRUE);<BR> m_disconnect.EnableWindow(FALSE);<BR> m_srvsocket->Close();<BR> Concount=0;<BR> KillTimer(2);<BR> }<BR> else<BR> {<BR> if(!m_srvsocket->Connect((sockaddr*)& cti,sizeof(cti)))<BR> {<BR> AddItem(m_messpage.count++,"正在尝试重新连接服务器,请稍后");<BR> }<BR> else<BR> { <BR> //连接成功<BR> AddItem(m_messpage.count++,"服务器连接成功");<BR> socketclose=0; //网络中断恢复连接<BR> KillTimer(2);<BR> }<BR> }<BR> break;<BR> }<BR> }<BR> CDialog::OnTimer(nIDEvent);<BR>}<BR><BR> 原先我没有在OnClose()中添加 Createsocket()(创建套接字),在OnTimer()每次重连均无法成功,添加后即成功;<BR> 问题是:<BR> 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> {<BR> delete pmem;<BR> pmem=NULL;<BR> }<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 + -