网络编程中遇到的问题,程序可以使用,但有几点不明白:CMySocket从CAsyncSocket类继承CMyDialog是我的基于对话框的MFC工程的主类:
我在CMyDialog中声明两个成员变量
CMySocket m_ListenServer,m_Connection;
问?
我在CMySocket中重载了虚函数OnClose
CMyDialog  dlg;
viod CMySocket::OnClose(nErrorCode)
{
dlg.OnClose();
//CAsyncSocket::OnClose();
}这样在我点CMyDialog的对话框关闭按钮响应函数OnClose时,
我在CMySocket中设断点并没有直接进入CMyDialog::OnClose()中
而是先调用了CAsyncSocket::OnClose();他不是明明被我注解掉了吗?
为什么还有呢,还有 CMySocket::OnClose(nErrorCode)什么时间会被调用呢?我是觉的应该会出现递归调用现象,却没有出现
dlg.Onclose->CMysocket.Onclose()->dlg.Onclose()你们说呢

解决方案 »

  1.   

    Socket的关闭怎么会影响到dlg呢,
    要是这样的话,你调用用m_ListenServer或m_Connection的Close()很窗口是不是就关了呢?
      

  2.   

    在点对话框的OnClose时我对CSocket类对象进行了关闭操作.
      

  3.   

    把关闭代码写在onClose中了,
    即在点对话框关闭时
    CDialogServer::Onclose()
    {
       m_ListenServer.Close();
    }
    而在MySocket::Oncluse()
    {
    dlg.Onclose()
    }是不是一个递归?
    而且我在m_listenServer.close()时设断点跟进去,他执行的是CAsyncSocket::OnClose();
    为什么?我不是重载了这个虚函数吗,而且我把他调用基类的部分注解了呀,
    那我派生类中的MySocket::oncluse又是什么时间调用呢
      

  4.   

    好像比较乱,我看了半天都没则么明白,搂主代码的意思。首先,你也许对递归的概念还不明白,另外,你对实例和类的概念还有点不清楚。
    既然CMyDialog是我的基于对话框的MFC工程的主类,系统自然会有一个默认实例,搂主为什么还要声明CMyDialog  dlg;然后再Socket类的关闭中关闭呢?这样根本不会影响到主对话框的。另外,出现以上现象可能是这样的原因,当关闭程序的时候,系统会自动释放CMyDialog的所有成员函数,也就是会调用类中成员变量(实例)的析构函数,如果该实例没有被关闭的话,则自动调用该实例的Close方法。也就是这样执行,CMyDialog.Close()->CMySocket.~CMySocket()->CMySocket.Close()不知道你明白我的意思了吗?