Close只是close CSocket里面的系统socket对象,并不释放CSocket的内存
再CSocket的析构里面很可能会判断socket状态,再决定是否再次调用close。
另外对一个socket对象使用多次closehandle也不会出现什么问题的

解决方案 »

  1.   

    当socket已经关闭,但是发送线程暂时不知道,仍然在不断发送数据,会不会出现问题。
    当我的client端断开后,我的server端出错了,跟踪进去,好像CSocket封装的窗口已经无效了
    ASSERT(pState->m_hSocketWindow != NULL);这是什么原因呢?
      

  2.   

    请高手详细阐述这种情况下Close和delete的区别。
      

  3.   

    First: Close();
    Second:Delete;
      

  4.   

    closesocket() 会释放系统分配给socket的资源,这在msdn里有说明
      

  5.   

    需要显示的调用Delete删除,如果是你自己的CSocket派生类,可以在PostNcDestroy里面加入Delete this;自动删除。不是,就需要自己判断销毁时间调用Delete pSocket;
      

  6.   

    我的程序发送任务是由另外一个线程负责的。
    当客户端断开时,我的程序在服务器端OnClose中侦测到断开,于是我就在OnClose中对发送线程
    作退出处理。
    因为发送线程是相对独立的,当服务器端侦测到连接断开时,发送线程可能还在不停的发送数据。
    于是出现上述这种socket窗口已经撤销的情况。高手请指点一下,我该怎样协调一下?谢谢啦!
      

  7.   

    记住:new 和delete是成对出现的!
      

  8.   

    简单,让发送线程来close 这个socket。要设置一个全局标志,Onclose里面设置标志为true。sender线程检查到true标志后就close socket然后退出。试试吧,乖乖小鹿
      

  9.   

    to jsd198():
    我知道了,谢谢。to Kevin_qing(Kevin):
    我还有疑问,Msdn中如是说:
    Called by the framework to notify this socket that the connected socket is closed by its process. 在OnClose函数响应时,socket已经被所在进程关闭了。按你的方法,在发送线程根据在
    OnClose中设置的标记再关闭socket,岂不是多此一举!
      

  10.   

    OnClose(): Notifies a socket that the socket connected to it has closed.
    就是说这里的onclose是指socket的连接中止了,并不是说你已经调用了CSocket::close()。连接中止后还是要使用close来关闭socket的句柄。另外MFC的CSocket实现有bug,在2000上面容易非法操作。