可以在CServerSocket里作一个标志,OnClose时置之,让CMySocket查询serversocket[100],再调用CServerSocket::Close().

解决方案 »

  1.   

    同意 qinxiaogang(qinxg) 你还可以try delete this 这种写法
    accept的时候传一个CMySocket的指针,总之让CServerSocket可以得到serversocket[100],
    在CServerSocket::Close()中处理serversocket[100],
    最后Close然后delete this
    因为每个连接和断开都可以得到事件,所以得到客户连接数还有访问和控制连接的socket是很好说的,但是要自己编程,好像没有什么有效的API可以得到
      

  2.   

    可以这样做,先在OnClose()中调用Close函数,然后再查询serversocket[100]中的各变量的成员变量m_hSocket是否等于INVALID_SOCKET
      

  3.   

    我想你肯定是用这样结构:一个listen socket, 和随时生成的用于连接的socket。我想有这样两种方法:直接用api,这个可以使用WSASyncSelect函数,自定义一个网络消息,将该消息与一个窗口绑定,WSAAsyncSelect(Listen /* 监听socket */, Window /* 处理消息的窗口 */,
        WM_SOCKET /* 自定义消息 */, FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE);
    在该窗口的窗口处理函数中,处理你自己的消息,在处理时,可用以下语句: ...               // 其他的处理部分case WM_SOCKET:    // 你自己定义的网络消息
    {
       if (WSAGETSELECTERROR(lParam)      // 如果出错
       {
            closesocket(wParam);          // wParam 表示发生网络事件的socket
            break;
       }   switch (WSAGETSELECTEVENT(lParam))
       {
          case FD_ACCEPT:
          {
               ...;
          }
         
          case FD_READ:
          {
               ...;
          }      case FD_WRITE:
          {
               ...;
          }      case FD_WRITE:
          {
               ...;
          }      case FD_CLOSE       // 某个socket发生了关闭事件,可能是主动的,也可能是被动
          {
               closesocket(wParam);   // wParam -- 发生了关闭事件的socket,使用这个
                                      // 函数可能需要强制转换
               ...                    // 你自己的处理过程           break;
          }
       }
    }...
      

  4.   

    如果用CAsyncSocket类,你可以用一个CConnectSocket类作为连接用的socket类,从CAsyncSocket继承而来,然后加一个变量,用来指示在serversocket[100]中的位置,当其某一个对象因为收到close消息,而调用OnClose()时,就可以把其序号发给监听类,让监听类去掉相应的socket对象