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;

}