bool CAsyncSocket::Create(
long lEvent ) file:
//参数lEvent是指定你所关心的Socket事件

{

m_hSocket = socket( PF_INET, SOCK_STREAM, 0 ); file:
//建立Socket自己

CSocketWnd* pSockWnd =
new CSocketWnd; file:
//建立响应事件的窗口,实际的这个窗口在AfxSockInit()调用时就被建立了。

pSockWnd->Create(...);

WSAAsyncSelect( m_hSocket, pSockWnd->m_hWnd, WM_SOCKET_NOTIFY, lEvent ); file:
//Socket事件和窗口关联

}
static
void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)

{

CAsyncSocket Socket;

Socket.Attach( (SOCKET)wParam ); file:
//wParam就是触发这个事件的Socket的句柄
int nErrorCode = WSAGETSELECTERROR(lParam); file:
//lParam是错误码与事件码的合成
switch (WSAGETSELECTEVENT(lParam))

{
case FD_READ:

pSocket->OnReceive(nErrorCode);
break;
case FD_WRITE:

pSocket->OnSend(nErrorCode);
break;
case FD_OOB:

pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:

pSocket->OnAccept(nErrorCode);
break;
case FD_CONNECT:

pSocket->OnConnect(nErrorCode);
break;
case FD_CLOSE:

pSocket->OnClose(nErrorCode);
break;

}

}

CSocketWnd类大体为:

BEGIN_MESSAGE_MAP(CSocketWnd, CWnd)

ON_MESSAGE(WM_SOCKET_NOTIFY, OnSocketNotify)

END_MESSAGE_MAP()

LRESULT CSocketWnd::OnSocketNotify(WPARAM wParam, LPARAM lParam)

{

CAsyncSocket::DoCallBack( wParam, lParam ); file:
//收到Socket事件消息,回调CAsyncSocket的DoCallBack()函数
return 0L;

}