他弄那么多空函数来做什么????
class CAsyncSocketEx : public CObject
{
DECLARE_DYNAMIC(CAsyncSocketEx);
         
         
}void CAsyncSocketEx::OnReceive(int nErrorCode)
{
}void CAsyncSocketEx::OnSend(int nErrorCode)
{
}
=========
static LRESULT CALLBACK WindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
#ifdef USE_CLIENT_TCP_CATCH_ALL_HANDLER
try
{
#endif
if (message>=WM_SOCKETEX_NOTIFY)
{
//Verify parameters
ASSERT(hWnd);
CAsyncSocketExHelperWindow *pWnd=(CAsyncSocketExHelperWindow *)GetWindowLong(hWnd, GWL_USERDATA);
ASSERT(pWnd); if (message<static_cast<UINT>(WM_SOCKETEX_NOTIFY+pWnd->m_nWindowDataSize)) //Index is within socket storage
{
//Lookup socket and verify if it's valid
CAsyncSocketEx *pSocket=pWnd->m_pAsyncSocketExWindowData[message-WM_SOCKETEX_NOTIFY].m_pSocket;
SOCKET hSocket=wParam;
if (!pSocket)
return 0;
if (hSocket==INVALID_SOCKET)
return 0;
if (pSocket->m_SocketData.hSocket!=hSocket)
return 0; int nEvent=lParam&0xFFFF;
int nErrorCode=lParam>>16; //Dispatch notification
#ifndef NOLAYERS
if (!pSocket->m_pFirstLayer)
{
#endif //NOLAYERS
//Dispatch to CAsyncSocketEx instance
switch (nEvent)
{
case FD_READ:
{
DWORD nBytes;
if (!pSocket->IOCtl(FIONREAD, &nBytes))
nErrorCode = WSAGetLastError();
if (nBytes != 0 || nErrorCode != 0)
pSocket->OnReceive(nErrorCode);  ///////////////////这个是空函数啊!!!!
}
break;
case FD_FORCEREAD: //Forceread does not check if there's data waiting
pSocket->OnReceive(nErrorCode);  ///////////////////这个是也空函数啊!!!!
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);  ///////////////////这个也是空函数啊!!!!
break;
case FD_CONNECT:
pSocket->OnConnect(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);
break;
case FD_CLOSE:
pSocket->OnClose(nErrorCode);
break;
}
}