关于WSAAsyncSelect(异步)与重叠I/O的综合使用,该如何解决

关于WSAAsyncSelect(异步)与重叠I/O的综合使用
关于WSAAsyncSelect(异步)与重叠I/O的综合使用
请大家帮忙看一下哪里有错误,谢谢!
short CServerSocket::StartupSocket()
{
int   iErrorCode;
//产生相应传递给窗口的信息为   WM_SERVER_ACCEPT   此信息为自定义
iErrorCode   =   WSAAsyncSelect(m_hSocketServer,   AfxGetApp()-> GetMainWnd()-> m_hWnd,WM_SOCKET_SERVER,   FD_ACCEPT   |   FD_READ   |   FD_CLOSE   );
//   WSAAsyncSelect   failed   on   socket
if(iErrorCode   ==   SOCKET_ERROR)
{
//异步SOCKET失败
char   chError[56];  
LoadString(NULL,IDS_ASYNCSOCKET,chError,sizeof(chError));
MessageBox(NULL,   chError,   chCaption,   MB_OK);
return   4;  
}
if(listen(m_hSocketServer,   nMaxListenUser)   ==   SOCKET_ERROR)
{
//监听SOCKET失败
char   chError[56];  
LoadString(NULL,IDS_LISTENSOCKET,chError,sizeof(chError));
MessageBox(NULL,   chError,   chCaption,   MB_OK);
return   5;
}
return   0;
}
LRESULT   CServerSocket::OnAccept(WPARAM   wParam,LPARAM   lParam)
{
nSockIndex   =   GetEmptySocket();  
int   nLength   =   sizeof(m_SockClientaddr[nSockIndex]);
m_hSocketClient[nSockIndex]   =   accept(m_hSocketServer,(sockaddr   *)&m_SockClientaddr[nSockIndex],   &nLength);
m_hEvent[nSockIndex]   =   WSACreateEvent();
    //SOCKADDR_IN       acceptaddr;      
    //int       nlen       =       sizeof(acceptaddr);
    //SOCKET       m_Client       =       accept(m_hSocketServer,(sockaddr   *)&acceptaddr,&nlen);
    //if(m_Client       ==       SOCKET_ERROR)
    //{      
//服务器接收SOCKET错误!
//char   chError[56],   chCaption[56];
//memset(chError,   0,   sizeof(chError));
//memset(chCaption,   0,   sizeof(chCaption));
//LoadString(NULL,   IDS_SOCKET,   chCaption,   sizeof(chCaption));
//LoadString(NULL,IDS_ACCEPTSOCKET,chError,sizeof(chError));
//MessageBox(NULL,   chError,   chCaption,   MB_OK);
//WSAGetLastError();
//return   -1L;
    //}
//int       nlen       =       sizeof(m_sockServerAddr);      
//m_hSocketClient   =   accept(m_hSocketServer,(sockaddr   *)&m_sockServerAddr,   &nlen);

//HANDLE   hHandle   =   AfxBeginThread(TalkToClient,   (LPVOID)m_hSocketClient);
//if(hHandle   ==   NULL)
//{
// int   nStatus=closesocket(m_hSocketClient);
// if(nStatus   ==   NULL)
// return   0L;
//}
return   0L;
}

UINT   CServerSocket::TalkToClient(void     *sockclient)
{
int   iResult;
char   buffer[MAXDATASIZE];
memset(buffer,   0,   sizeof(buffer));
SOCKET   clientSocket=(SOCKET)sockclient;
while(1)
{
iResult   =   recv(clientSocket,   (char*)buffer,   sizeof(buffer),   0);  
if(iResult   ==   0   ||   iResult   ==   SOCKET_ERROR)
{
AfxEndThread(0); break;
}
buffer[iResult]=   _T( '\0 ');
TRACE0(_T(buffer));
AfxMessageBox(buffer);
}
ExitThread(0);