
LoginSvr
g_gcSock Local    5500˿
1ȴLoginSvr.cpp  WinMain
   1) CheckAvailableIOCP : ǲNT2000ϵͳIOCP
   2) InitInstance: ʼ棬WSAStartup
       GetDBManager()->Init( InsertLogMsg, "Mir2_Account", "sa", "prg" );
       ݿ࣬ײݿ
 
3)       MainWndProcڻصOnCommand:
IDM_STARTSERVICE:
LoadAccountRecords߳
a). UPDATE TBL_ACCOUNTʻ֤״̬
b). б(TBL_SERVERINFO, selGate)g_xGameServerList
xGameServerListбѷϢ뵽һַg_szServerListС
c). InitServerThreadForMsg̡߳
          d). InitServerSockeṭ߳
           AcceptThreaḍ߳
           ServerWorkerThreaḍ߳
InitServerSockeṭ߳
    1) AcceptThreaḍ߳
Accept֮һCGateInfoCGateInfo->sock = Accept; ͻSocketֵֵṹ塣¼ͻϢµ׽־CreateIoCompletionPortɶ˿ڣȻ󷢳һ첽WSASendWSARecv(pNewUserInfo->Recv();տͻϢ)Ϊ첽WSASend/WSARecvϷأʵʵķͻ߽ݵĲWINDOWSϵͳȥȻCGateInfog_xGateListСڿͻaccept֮ͶһI/O(recv)
һg_xGateList֣ÿCGateInfosock; xUserInfoListg_SendToGateQصϢΣضӦsock, ûϢϢУΪLoginGate¼ط
 
2) ServerWorkerThreaḍ߳
ServerWorkerThread̹߳ԭ
ѭGetQueuedCompletionStatus()õIOWINDOWSϵͳWSASendWSArecvĲѽɶ˿ڡGetQueuedCompletionStatus()Ϸ,ɶ˿ȡøɵWSASend/WSARecvĽȻŷWSASend/WSARecvһѭGetQueuedCompletionStatus()
a).if (g_fTerminated) ߳̽ǰѭg_xGateListȡpGateInfoر׽֣ɾڵ㡣dwBytesTransferred =0 ,رո÷׽֡
b).while ( pGateInfo->HasCompletionPacket() ) ֤Ϣʽ
case '-': ݰÿLoginGate
 
case 'A':  ÿLoginGatתĿͻ˵Ϣӵ(CGateInfo)g_SendToGateQУȻThreadFuncForMsg֤߳̽ٷϢLoginGate
       pGateInfo->ReceiveSendUser(&szTmp[2]);
 
case 'O': ÿAcceptͻ˺pUserInfoûϢصxUserInfoListбС
      pGateInfo->ReceiveOpenUser(&szTmp[2]);
 
case 'X': ÿյͻSocketر֮͹ϢøsocketӦ״̬
      pGateInfo->ReceiveCloseUser(&szTmp[2]);
 
case 'S':  GameSvr͵ϢTBL_ACCOUNTֶ֤Σ˵ûߣ´ε¼ȵLoginSvrٴ֤
      pGateInfo->ReceiveServerMsg(&szTmp[2]);
 
case 'M':  GameSvr͵Ϣ,һûϢûID,ֲTBL_ACCOUNTвɹSM_NEWID_SUCCESS,SM_NEWID_FAILϢǰ#Ϣ!  TBL_ACCOUNTADDӣֻTBL_ACCOUNTϢ
 
              A:LoginGate תͻϢg_xMsgQueue, ThreadFuncForMsg̴߳תloginGate
ͶI/O
 
InitServerThreadForMsg ThreadFuncForMsg̡߳c   
յloginGate͹Ϣ֮ServerWorkerThreadݰ֮case 'A'ѿͻ˵Ϣдg_SendToGateQУȻڱ߳ٽд
             g_SendToGateQݣ֤ݰǷȷ#!ַDefaultMsg.wIdent־
case CM_IDPASSWORD:   ½ҵ
         xUserInfoListûбϢݿTBL_ACCOUNTӦϢʧܷ(SM_ID_NOTFOUND, SM_PASSWD_FAIL)ϢSM_PASSOK_SELECTSERVER+ g_szServerListSelGateбϢ
SelGateбϢӦTBL_SERVERINFOݿݣûѡ¼SelGate
                 
      CM_SELECTSERVER: ѡ(SelGate)
             xUserInfoListûбϢsocket,ҵûԿϢܺ󣬱g_xGameServerListбûѡSelGateתΪIPַLoginGateתͻˡøûSelServerı־״̬ӸصxUserInfoListûбɾû
 
CM_ADDNEWUSER:  עû
                    жûǷѴڣʧܷSM_NEWID_FAILϢɹдݣSM_NEWID_SUCCESSϢ LoginGateתͻˡ
 
IDM_STOPSERVICE: ֹͣ(IOCPģServerӦͻ)
   Close -> OnCommand(IDM_STOPSERVICE, 0L); ->g_fTerminated = TRUE; ߳˳
 
Ҫ̣
LoginSvrAcceptThread,ServerWorkerThreaḍ߳AcceptThread߳̽loginGateGameSvrӣg_xGateListбУServerWorkerThread̴߳ɶ˿ȡøɵWSASend/WSARecvĽ󣬽зϢͬʱThreadFuncForMsg̴̣߳߳g_xMsgQueue(iocploginGate)ȡݣݡͶI/OIOCPģͣ͵loginGate
