(1)在App中new 了个CSocket作为全局变量gpSocket.
(2)首先Create,然后Connect到服务器。
(3)然后接受数据。同时发送数据。出现如下问题:在另外一个UI线程中调用Close的时候出错,巾帼调试,发现出错的地方如下:
BOOL CAsyncSocket::AsyncSelect(long lEvent)
{
  ASSERT(m_hSocket != INVALID_SOCKET);
  _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
  ASSERT(pState->m_hSocketWindow != NULL);//出错的地方,也即是说wnd为空的。  return WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;
}其中,AsyncSelect被CSocket::Close调用,具体代码如下:
void CSocket::Close()
{
  if (m_hSocket != INVALID_SOCKET)
  {
   CancelBlockingCall();   VERIFY(AsyncSelect(0));
   CAsyncSocket::Close();
   m_hSocket = INVALID_SOCKET;
  }
}请问我的具体问题在哪里,是否合多线程有关系,为什么,如何解决?在线等待,谢谢!

解决方案 »

  1.   

    CSocket不能跨线程传递SOCKET句柄。要跨线程,用SOCKET API
      

  2.   

    非常感谢您的答复。
    我现在的做法是在app中创建此CSocket,然后在其他UI线程中使用它。比如说Create,Connect,Close等等。按照您的意思,是否意味一个线程中创建的CSocket智能在此线程中使用,比如Create,Connect, Close等等?
      

  3.   

    对。不然会莫名其妙的出问题,CSocket::m_hSocket有时莫名其妙的无效。
      

  4.   

    但现在出问题的地方在:
    ASSERT(pState->m_hSocketWindow != NULL);//出错的地方,也即是说wnd为空的。也就说和句柄没有关系,只和窗口有关系呀!
      

  5.   

    CSocket不是线程安全的。跨线程就不能用。你那个_AFX_SOCK_THREAD_STATE不知道是个什么东西,想必在跨线程的时候,其中的值被别的线程修改了。你要跨线程,用socket api好了
      

  6.   

    线程安全?我尝试过在Close,Connect,Receive等等一些函数之间都加入Lock和UnLock,但是效果是一样的。
    我认为这个肯定和线程有关,但是现在问题到底在哪里,如何解决?
      

  7.   

    晕。问题就是CSocket不是线程安全的。不能用在跨线程的场合。不信算了,呵呵
      

  8.   

    我刚刚还去测试过,确实如你们所言,一个线程中的CSocket在另外一个线程中调用Close会出现错误,而且错误处也是上面所说的地方。这么说来我必须重写我的类了?
    有些简单的方法做到这个吗?
      

  9.   

    反正我是自从发现这个问题之后就改用API了。再没用过MFC的SOCKET类