Mfc CAsyncSocket::Receive返回WSAENOTSOCK

Mfc CAsyncSocket::Receive返回WSAENOTSOCK,mfc,winsock,asyncsocket,Mfc,Winsock,Asyncsocket,我使用一个简单的CAsyncSocket来实现TCP服务器。我看不出有什么错误。不过,Receive返回WSAENOTSOCK: class CMyWnd : CWnd { CMySock m_sListener; CMySock m_sConnected; } CMyWnd::CMyWnd() { m_sListener.SetWnd(this); m_sConnected.SetWnd(this); // ... m_sListener.Create(56999,

我使用一个简单的CAsyncSocket来实现TCP服务器。我看不出有什么错误。不过,Receive返回WSAENOTSOCK:

class CMyWnd : CWnd
{
  CMySock m_sListener;
  CMySock m_sConnected;
}


CMyWnd::CMyWnd()
{
  m_sListener.SetWnd(this);
  m_sConnected.SetWnd(this);
  // ...
  m_sListener.Create(56999, SOCK_STREAM, FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE, _T("127.0.0.1"));
  if(m_sListener.Listen() == FALSE) { exit(1)] }
}


void CMyWnd::OnReceive(void)
{
  TCHAR p[MAX_MSGLEN];
  memset(p, 0, sizeof(p));
  int nRead;
  nRead = m_sConnected.Receive(p, MAX_MSGLEN);
  if(nRead == SOCKET_ERROR)
  {
    UINT dwErr = GetLastError(); // returns WSAENOTSOCK!!
  }
}

void CMyWnd::OnAccept(void)
{
  m_sListener.Accept(m_sConnected);
}
CMySock只是从CAsyncSock中简单地继承,并传递到window类:

 void CMySock::OnAccept(int nErrorCode)
 {
   if(m_pWnd && nErrorCode==0)
   {
     m_pWnd->OnReceive();
   }
   CAsyncSocket::OnAccept(nErrorCode);
 }

 void CMySock::OnReceive(int nErrorCode)
 {
   if(m_pAgentWnd && nErrorCode==0)
   {
     m_pWnd->OnReceive();
   }
   CAsyncSocket::OnReceive(nErrorCode);
 }

这不可能返回WSAENOTSOCK,因为它必须是一个套接字!它由accept iself返回,我在收到数据时也会收到通知。

OMG,这怎么可能?看看CMySock::OnAccept。它会在接收时调用。 这么一个小错误,我花了一个多小时在上面