SelGate
עͻ˴LoginSvrõSelGateIP֮SelGateн
ɫɾѡȻݵDBSrv
g_ssock  Local    7100ͻ˵½˿
g_csock Remote   5100͵DBSrvϵ׽
 
1ȴSelGate.cpp WinMain
    1) CheckAvailableIOCP : ǲNT2000ϵͳIOCP
    2) InitInstance: ʼ棬WSAStartup
3) MainWndProcڻص.
2MainWndProc.CPPзصMainWndProc
switch (nMsg)
    {
        case _IDM_CLIENTSOCK_MSG:
        case WM_COMMAND:
        case WM_CLOSE
1_IDM_CLIENTSOCK_MSG Ϣ
   SelGateصͨѶ¼
ãOnClientSockMsg,úһص
             ֮ConnectToServer(_IDM_CLIENTSOCK_MSGϢ FD_CONNECT|FD_READ|FD_CLOSE)WSAAsyncSelecthWndھӦĴWindowsϢʽ¼֪ͨOnClientSockMsgҪDBSrv֮ͨţתͻݰȣ 
switch (WSAGETSELECTEVENT(lParam))
   {
       case FD_CONNECT:
       case FD_CLOSE:
       case FD_READ: 
 
FD_CONNECT()
    A. CheckSocketErrorʱ
a). ConnectToServerڷʱִһΡص
FD_CONNECT
             b)DBSrvʱ,ThreadFuncForMsg̣߳Ѵӿͻ˷͵(g_xMsgQueue, FD_READ¼DBSrv)ͶI/OIOCPģͣ͵ͻˡSleepEx߳,һI/O ɻصáһ첽̵Ŷӵ̡߳ 
ThreadFuncForMsg̼߳(DBSrvյg_xMsgQueueݰ-)i/o ͶݣIOCP͸ͻˡ
   if (nSocket = AnsiStrToVal(pszFirst + 1)) //õsocket
   WSASend((SOCKET)nSocket, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
   
c)ֹʱ_ID_TIMER_CONNECTSERVER
KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
d)_ID_TIMER_KEEPALIVEʱ ݰ
SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE
     öʱصOnTimerProc: ʱݰDBSrvSendExToServer(PACKET_KEEPALIVE);
 
 
B. socketϿ_ID_TIMER_CONNECTSERVERʱ
ConnectToServerӷ     
                     _ID_TIMER_CONNECTSERVER, (TIMERPROC)OnTimerProc);
            
            FD_CLOSE:
                 ϿSOCKETӣOnCommand(IDM_STOPSERVICE, 0); صIDM_STOPSERVICE
 
            case FD_READ:
                 DBSrv͵ݰ,½֤selCurַݼ뻺(g_xMsgQueue)С
 
             
     WM_COMMAND:
          IDM_STARTSERVICE: (IOCPģServerӦͻ)
          IDM_STOPSERVICE: ֹͣ(IOCPģServer)
     WM_CLOSE:
         IDM_STOPSERVICE: ֹͣ(IOCPģServer)
         WSACleanup();
PostQuitMessage(0); //WM_DESTROYϢ
 
IDM_STARTSERVICE: (IOCPģServerӦͻ)
InitServerSocket
1) AcceptThreaḍ߳
        Accept֮һCSessionInfopNewUserInfo->sock = Accept; ͻSocketֵֵṹ塣¼ͻϢ
µ׽־CreateIoCompletionPortɶ˿ڣȻ󷢳һ첽WSASendWSARecv(pNewUserInfo->Recv();տͻϢ)Ϊ첽WSASend/WSARecvϷأʵʵķͻ߽ݵĲWINDOWSϵͳȥȻCSessionInfog_xSessionListСDBsrvûSessionϢ%0socket/ip$\0          
     ڿͻaccept֮ͶһI/O(recv),ȻӦݷDBSrv 
 
   2) CreateIOCPWorkerThread
         CreateIoCompletionPort ݴһServerWorkerThread̡߳
 
 ServerWorkerThread̹߳ԭ
ѭGetQueuedCompletionStatus()õIOWINDOWSϵͳWSASendWSArecvĲѽɶ˿ڡGetQueuedCompletionStatus()Ϸ,ɶ˿ȡøɵWSASend/WSARecvĽȻŷWSASend/WSARecvһѭGetQueuedCompletionStatus()
a). pSessionInfoΪջdwBytesTransferred =0 ,ڿͻclose socketӦݰ(쳣DBSrv(X-ݰ)رտͻװ֡
        b). while ( pSessionInfo->HasCompletionPacket() ) ֤ȷתݰ(A-ݰ) DBSrv
 c). if (pSessionInfo->Recv() ͶI/O
      ܽ᣺
ǲͣط첽WSASend/WSARecv IOIOWINDOWSϵͳɣWINDOWSϵͳʵʵIO󣬰ѽ͵ɶ˿ϣжIOˣôɶ˿ųһУһ߳ɶ˿ڲϵȡIOȻҪٷWSASend/WSARecv IO
     
 
IDM_STOPSERVICE: ֹͣ(IOCPģServerӦͻ)
   Close -> OnCommand(IDM_STOPSERVICE, 0L); ->g_fTerminated = TRUE; ߳˳
            ClearSocket(g_ssock);
            ClearSocket(g_csock);
            CloseHandle(g_hIOCP);
 
ܽ᣺SelGateɫܿͻӣҰûݰ(ɫ)͵DBSrvУDBSrv֮󣬷ݰظͻˡSelGate֮ͨʱʱ͡ݡ֤ġͻ˵ڴУǽйܵġ
DBSrv   %A+Msg+$0Ϣ תͻϢ
               %X+Msg+$0Ϣ ûϢӵûб
               %O+Msg+$0Ϣ ûϢ
 
Ҫ̣
SelGateAcceptThread,ServerWorkerThreaḍ߳AcceptThread߳̽տͻӣsessionϢ͸DBSrvServerWorkerThread̴߳ɶ˿ȡøɵWSASend/WSARecvĽ󣬰ѿͻתDBSrvʱWSAAsyncSelectģӵDBSrvСһӳɹThreadFuncForMsg̴̣߳߳g_xMsgQueue(FD_READ¼DBSrv)ȡDBSrvݡͶI/OIOCPģͣ͵ͻˡ
ServerWorkerThreadתͻ -> WSAAsyncSelectReadDBSrv󷵻ص-> ThreadFuncForMsg̣߳ͶWSASendϢWindowsIOCPݸͻˡ