锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久人人爽人人爽人人片AV不,国产精品美女久久久,色婷婷久久综合中文久久蜜桃avhttp://www.shnenglu.com/Error/category/17009.htmlzh-cnFri, 19 Oct 2012 11:00:56 GMTFri, 19 Oct 2012 11:00:56 GMT60鍗忚鍒嗘瀽-鏈嶅姟鍣ㄦ帴鏀?/title><link>http://www.shnenglu.com/Error/articles/150207.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 05 Jul 2011 05:15:00 GMT</pubDate><guid>http://www.shnenglu.com/Error/articles/150207.html</guid><wfw:comment>http://www.shnenglu.com/Error/comments/150207.html</wfw:comment><comments>http://www.shnenglu.com/Error/articles/150207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Error/comments/commentRss/150207.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Error/services/trackbacks/150207.html</trackback:ping><description><![CDATA[<p>鍦ㄦ湇鍔″櫒鍝噷,緗戠粶閫氫俊鏈変袱涓帴鍙?IClientSocketSink IAttemperEngineSink<br />IClientSocketSink涓鑸敤鐢ㄤ簬緗戠粶鏈嶅姟鍣ㄤ箣闂撮氫俊<br />IAttemperEngineSink鐢ㄤ簬鍜屽鎴風閫氫俊</p> <p>// logon server<br />CAttemperEngineSink::OnEventSocketRead<br />    MDM_GP_LOGON  //鐧誨綍娑堟伅<br />        SUB_GP_LOGON_ACCOUNTS  //甯愬彿鐧誨綍<br />      CMD_GP_LogonByAccounts<br />  SUB_GP_LOGON_USERID  //ID 鐧誨綍<br />   CMD_GP_LogonByUserID<br />  SUB_GP_REGISTER_ACCOUNTS  //娉ㄥ唽甯愬彿<br />      CMD_GP_RegisterAccounts<br />   <br />// gamer server<br />CAttemperEngineSink::OnEventSocketRead<br /> MDM_GR_LOGON  //鐧誨綍娑堟伅<br />        SUB_GP_LOGON_ACCOUNTS  //甯愬彿鐧誨綍<br />      CMD_GP_LogonByAccounts<br />  SUB_GP_LOGON_USERID  //ID 鐧誨綍<br />   CMD_GP_LogonByUserID<br /> MDM_GR_USER  //鐢ㄦ埛娑堟伅<br />  SUB_GR_USER_SIT_REQ  //鍧愪笅妗屽瓙<br />  SUB_GR_USER_LOOKON_REQ  //鏃佽妗屽瓙<br />   CMD_GR_UserSitReq<br />  SUB_GR_USER_STANDUP_REQ  //璧風珛璇鋒眰<br />  SUB_GR_USER_LEFT_GAME_REQ  //寮洪璇鋒眰<br />  SUB_GR_USER_CHAT  //鑱婂ぉ娑堟伅<br />   CMD_GR_UserChat<br />  SUB_GR_USER_WISPER  //縐佽娑堟伅<br />   CMD_GR_Wisper<br />  SUB_GR_USER_RULE  //鐢ㄦ埛瑙勫垯<br />   CMD_GR_UserRule<br />  SUB_GR_USER_INVITE_REQ  //閭璇風敤鎴?br />   CMD_GR_UserInviteReq<br /> MDM_GR_MANAGER  //綆$悊娑堟伅<br />  SUB_GR_SEND_WARNING: //璀﹀憡娑堟伅<br />   CMD_GR_SendWarning<br />  SUB_GR_LOOK_USER_IP: //鏌ョ湅鍦板潃<br />      CMD_GR_LookUserIP<br />  SUB_GR_KILL_USER:  //韙㈠嚭鐢ㄦ埛<br />   CMD_GR_KillUser<br />  SUB_GR_LIMIT_ACCOUNS: //紱佺敤甯愭埛<br />   CMD_GR_LimitAccounts<br />  SUB_GR_SET_USER_RIGHT: //鐢ㄦ埛鏉冮檺<br />   CMD_GR_SetUserRight<br />  SUB_GR_SEND_MESSAGE: //鍙戦佹秷鎭?br />   CMD_GR_SendMessage<br />  SUB_GR_OPTION_SERVER: //鎴塊棿璁劇疆<br />   CMD_GR_OptionServer<br /> MDM_GF_FRAME  //妗嗘灦娑堟伅<br /> MDM_GF_GAME  //娓告垙娑堟伅<br />  </p> <p>// center server<br />CAttemperEngineSink::OnEventSocketRead<br /> MDM_CS_SERVER_LIST:  //鍒楄〃娑堟伅<br />  SUB_CS_GET_SERVER_LIST:  //鑾峰彇鍒楄〃<br /> MDM_CS_SERVER_MANAGER: //鎴塊棿綆$悊 <br />  SUB_CS_REG_GAME_SERVER:  //鎴塊棿娉ㄥ唽<br />  SUB_CS_UNREG_GAME_SERVER:  //娉ㄩ攢鎴塊棿<br />  SUB_CS_SERVER_ONLINE_COUNT:  //鏇存柊浜烘暟</p><img src ="http://www.shnenglu.com/Error/aggbug/150207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Error/" target="_blank">Enic</a> 2011-07-05 13:15 <a href="http://www.shnenglu.com/Error/articles/150207.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍗忚鍒嗘瀽錛欸amePlaza鐨勭綉緇滃崗璁紙鏀訛級http://www.shnenglu.com/Error/articles/150109.htmlEnicEnicMon, 04 Jul 2011 05:48:00 GMThttp://www.shnenglu.com/Error/articles/150109.htmlhttp://www.shnenglu.com/Error/comments/150109.htmlhttp://www.shnenglu.com/Error/articles/150109.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/150109.htmlhttp://www.shnenglu.com/Error/services/trackbacks/150109.html閫氳繃瀵瑰熀紜搴撶殑鍒嗘瀽鍙互鐭ラ亾錛屽鎴風閫氳繃IClientSocket銆両ClientSocketSink鍜屾湇鍔″櫒閫氳銆?br />鐜板湪鎶婇棶棰橀泦涓搗鏉ワ紝鍙垎鏋愬鎴風鍜屾湇鍔″櫒涔嬮棿鐨勬帴鍙o紝涔熷氨鏄疘O
褰撳墠鍒嗘瀽鐨勬ā寮忔槸GamePlaza
CPlazaViewItem  CRoomViewItem榪欎袱涓疄鐜頒簡IClientSocketSink鎺ュ彛錛屼篃灝辨槸璇翠粬浠兘鎺ュ彈鏈嶅姟鍣ㄦ秷鎭紱
IClientSocketSink鑳藉搷搴斾笁涓簨浠禣nSocketConnect  OnSocketRead  OnSocketClose
涓昏鐨勬暟鎹氦鎹㈠簲璇ユ槸渚濊禆OnSocketRead
CPlazaViewItem
    OnSocketRead  
      MDM_GP_LOGON  
//鐧婚檰娑堟伅
        SUB_GP_LOGON_SUCCESS  //鐧婚檰鎴愬姛  
          CMD_GP_LogonSuccess
          (鎺ヤ笅鏉ョ殑鍙墿灞曚俊鎭?
          DTP_USER_ACCOUNTS  
//鐢ㄦ埛甯愭埛
            鏁版嵁鐢盌ataDescribe鎻忚堪
          DTP_USER_PASS  
//鐢ㄦ埛瀵嗙爜
            鏁版嵁鐢盌ataDescribe鎻忚堪
          DTP_USER_GROUP_NAME  
//紺懼洟鍚嶅瓧
            鏁版嵁鐢盌ataDescribe鎻忚堪
        SUB_GP_LOGON_ERROR  
//鐧婚檰澶辮觸
      MDM_GP_SERVER_LIST  //鍒楄〃娑堟伅
        SUB_GP_LIST_TYPE  //綾誨瀷淇℃伅
          tagGameType鏁扮粍 
        SUB_GP_LIST_KIND  
//縐嶇被娑堟伅
          tagGameKind鏁扮粍
        SUB_GP_LIST_PROCESS  
//榪涚▼淇℃伅
          tagGameProcess鏁扮粍
        SUB_GP_LIST_STATION  
//绔欑偣娑堟伅
          tagGameStation鏁扮粍
        SUB_GP_LIST_SERVER  
//鏈嶅姟鍣ㄦ埧闂?/span>
          tagGameServer鏁扮粍
        SUB_GP_LIST_FINISH  
//鍒楄〃鍙戦佸畬鎴?/span>
        SUB_GP_LIST_CONFIG  //鍒楄〃閰嶇疆
          CMD_GP_ListConfig
      MDM_GP_SYSTEM  
//緋葷粺娑堟伅
        SUB_GP_VERSION  //鐗堟湰淇℃伅
          CMD_GP_Version
CRoomViewItem
    OnSocketRead 
        MDM_GR_LOGON  
//鐧誨綍娑堟伅
            SUB_GR_LOGON_SUCCESS  //鐧誨綍鎴愬姛
            SUB_GR_LOGON_ERROR  //鐧誨綍澶辮觸
            SUB_GR_LOGON_FINISH  //鐧誨綍瀹屾垚
        MDM_GR_USER  //鐢ㄦ埛娑堟伅
            SUB_GR_USER_COME  //鐢ㄦ埛榪涘叆
                tagUserInfoHead
                    錛堥檮鍔狅級
                    DTP_USER_ACCOUNTS  
//鐢ㄦ埛甯愭埛
                    鏁版嵁鐢盌ataDescribe鎻忚堪
                    DTP_USER_GROUP_NAME  
//紺懼洟鍚嶅瓧
                    鏁版嵁鐢盌ataDescribe鎻忚堪
            SUB_GR_USER_STATUS  
//鐢ㄦ埛鐘舵?/span>
                CMD_GR_UserStatus
            SUB_GR_USER_SCORE  
//鐢ㄦ埛鍒嗘暟
                CMD_GR_UserScore
            SUB_GR_SIT_FAILED  
//鍧愪笅澶辮觸
                CMD_GR_SitFailed
            SUB_GR_USER_CHAT  
//鐢ㄦ埛鑱婂ぉ
                CMD_GR_UserChat
            SUB_GR_USER_WISPER  
//鐢ㄦ埛縐佽
                CMD_GR_Wisper
            SUB_GR_USER_INVITE  
//閭璇風帺瀹?/span>
                CMD_GR_UserInvite
        MDM_GR_INFO  
//閰嶇疆淇℃伅
            SUB_GR_SERVER_INFO  //鎴塊棿淇℃伅
                CMD_GR_ServerInfo
            SUB_GR_COLUMN_INFO  
//鍒楄〃瑙i噴
                CMD_GR_ColumnInfo
            SUB_GR_CONFIG_FINISH  
//閰嶇疆瀹屾垚
        MDM_GR_STATUS  //鐘舵佷俊鎭?/span>
            SUB_GR_TABLE_INFO  //妗屽瓙淇℃伅 
                CMD_GR_TableInfo
            SUB_GR_TABLE_STATUS  
//妗屽瓙鐘舵?/span>
                CMD_GR_TableStatus
        MDM_GR_SYSTEM  
//緋葷粺娑堟伅
            SUB_GR_MESSAGE  //緋葷粺娑堟伅
                CMD_GR_Message
        MDM_GR_SERVER_INFO  
//鎴塊棿淇℃伅
            SUB_GR_ONLINE_COUNT_INFO  //鍦ㄧ嚎淇℃伅
                tagOnLineCountInfo
        MDM_GF_GAME  
//娓告垙娑堟伅
        MDM_GF_FRAME  //妗嗘灦娑堟伅
            IPC_SocketPackage



Enic 2011-07-04 13:48 鍙戣〃璇勮
]]>
宸ュ叿綾伙細鏀跺彂鍖呰緟鍔╃被 CSendPacketHelpr CRecvPacketHelprhttp://www.shnenglu.com/Error/articles/150092.htmlEnicEnicMon, 04 Jul 2011 02:50:00 GMThttp://www.shnenglu.com/Error/articles/150092.htmlhttp://www.shnenglu.com/Error/comments/150092.htmlhttp://www.shnenglu.com/Error/articles/150092.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/150092.htmlhttp://www.shnenglu.com/Error/services/trackbacks/150092.html搴斾負鍗忚閮芥槸閬靛驚錛歭en type data榪欐牱鐨勭粨鏋勶紝鎵浠ユ墦鍖呭彂閫佸拰鎺ユ敹瑙e寘鍙互鏈夐氱敤鐨勫仛娉曪紝錛岋紝
 
//////////////////////////////////////////////////////////////////////////

//鏁版嵁鎻忚堪澶?/span>
struct tagDataDescribe
{
    WORD                            wDataSize;                        
//鏁版嵁澶у皬
    WORD                            wDataDescribe;                    //鏁版嵁鎻忚堪
};

//////////////////////////////////////////////////////////////////////////

//鏁版嵁鍖呰緟鍔╃被錛堝鍖呯粍鍚堟垚涓鍖咃級
class CSendPacketHelper
{
    
//鍙橀噺瀹氫箟
protected:
    WORD                                m_wDataSize;                    
//鏁版嵁澶у皬
    WORD                                m_wBufferSize;                    //緙撳啿澶у皬
    BYTE                                * m_pcbBuffer;                    //緙撳啿鎸囬拡

    
//鍑芥暟瀹氫箟
public:
    
//鏋勯犲嚱鏁?/span>
    CSendPacketHelper(void * pcbBuffer, WORD wBufferSize)
    {
        m_wDataSize
=0;
        m_wBufferSize
=wBufferSize;
        m_pcbBuffer
=(BYTE *)pcbBuffer;
    }
    
//鏋愭瀯鍑芥暟
    virtual ~CSendPacketHelper() {}

    
//鍔熻兘鍑芥暟
public:
    
//娓呯悊鏁版嵁
    void CleanData() { m_wDataSize=0; }
    
//鑾峰彇澶у皬
    WORD GetDataSize() { return m_wDataSize; }
    
//鑾峰彇緙撳啿
    void * GetDataBuffer() { return m_pcbBuffer; }
    
//鎻掑叆鏁版嵁錛堝鏋滅紦鍐插尯闀垮害涓嶅榪斿洖false錛?br />    // wDataSize, wDataType 瀹為檯涓婂氨鏄疍ataDescribe
    bool AddPacket(void * pData, WORD wDataSize, WORD wDataType)
    {
        
//鏁堥獙澶у皬
        ASSERT((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)<=m_wBufferSize);
        
if ((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)>m_wBufferSize) return false;

        
//鎻掑叆鏁版嵁
        ASSERT(m_pcbBuffer!=NULL);
        tagDataDescribe 
* pDataDescribe=(tagDataDescribe *)(m_pcbBuffer+m_wDataSize);
        pDataDescribe
->wDataSize=wDataSize;
        pDataDescribe
->wDataDescribe=wDataType;

        
//鎻掑叆鏁版嵁
        if (wDataSize>0)
        {
            ASSERT(pData
!=NULL);
            CopyMemory(pDataDescribe
+1,pData,wDataSize);
        }

        
//璁劇疆鏁版嵁
        m_wDataSize+=sizeof(tagDataDescribe)+wDataSize;
    
        
return true;
    }
};

/////////////////////////////////////////////////////////////////////////////////////////

//鏁版嵁鍖呰緟鍔╃被
class CRecvPacketHelper
{
    
//鍙橀噺瀹氫箟
protected:
    WORD                                m_wDataPos;                        
//鏁版嵁鐐?/span>
    WORD                                m_wDataSize;                    //鏁版嵁澶у皬
    BYTE                                * m_pcbBuffer;                    //緙撳啿鎸囬拡

    
//鍑芥暟瀹氫箟
public:
    
//鏋勯犲嚱鏁?/span>
    CRecvPacketHelper(LPCVOID pcbBuffer, WORD wDataSize)
    {
        m_wDataPos
=0;
        m_wDataSize
=wDataSize;
        m_pcbBuffer
=(BYTE *)pcbBuffer;
    }
    
//鏋愭瀯鍑芥暟
    virtual ~CRecvPacketHelper() {}

    
//鍔熻兘鍑芥暟
public:
    
//鑾峰彇鏁版嵁錛堣繑鍥炰竴鍖呮暟鎹級
    
// @DataDescribe錛氭暟鎹弿榪幫紙len type錛?br />    // @return: 鏁版嵁
    void * GetData(tagDataDescribe & DataDescribe)
    {
        
//鏁堥獙鏁版嵁
        if (m_wDataPos>=m_wDataSize) 
        {
            ASSERT(m_wDataPos
==m_wDataSize);
            DataDescribe.wDataSize
=0;
            DataDescribe.wDataDescribe
=DTP_NULL;
            
return NULL;
        }

        
//鑾峰彇鏁版嵁
        ASSERT((m_wDataPos+sizeof(tagDataDescribe))<=m_wDataSize);
        CopyMemory(
&DataDescribe,m_pcbBuffer+m_wDataPos,sizeof(tagDataDescribe));
        ASSERT((m_wDataPos
+sizeof(tagDataDescribe)+DataDescribe.wDataSize)<=m_wDataSize);

        
//鏁堥獙鏁版嵁
        if ((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)>m_wDataSize)
        {
            DataDescribe.wDataSize
=0;
            DataDescribe.wDataDescribe
=DTP_NULL;
            
return NULL;
        }

        
//璁劇疆鏁版嵁
        void * pData=NULL;
        
if (DataDescribe.wDataSize>0) pData=m_pcbBuffer+m_wDataPos+sizeof(tagDataDescribe);
        m_wDataPos
+=sizeof(tagDataDescribe)+DataDescribe.wDataSize;
        
return pData;
    };
};


Enic 2011-07-04 10:50 鍙戣〃璇勮
]]>
鎴愪篃钀т綍璐ヤ篃鑲栦綍錛?IUnknowExhttp://www.shnenglu.com/Error/articles/148413.htmlEnicEnicFri, 10 Jun 2011 04:30:00 GMThttp://www.shnenglu.com/Error/articles/148413.htmlhttp://www.shnenglu.com/Error/comments/148413.htmlhttp://www.shnenglu.com/Error/articles/148413.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148413.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148413.html

鐪嬩笅鏌愪釜鏌ヨ鎺ュ彛鐨勪唬鐮侊細
//////////////////////////////////////////////////////////////////////////

//鎺ュ彛鏌ヨ瀹?/span>
#define QUERYINTERFACE(Interface,Guid,dwQueryVer)                                        \
    
if ((Guid==IID_##Interface)&&(InterfaceVersionCheck(dwQueryVer,VER_##Interface)))    \
        
return static_cast<Interface *>(this);                                            

#define QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer)                        \
    
if ((Guid==IID_IUnknownEx)&&(InterfaceVersionCheck(dwQueryVer,VER_IUnknownEx)))        \
        
return static_cast<IUnknownEx *>(static_cast<BaseInterface *>(this));            

//鑾峰彇鎺ュ彛瀹?/span>
#define GET_MYSELF_INTERFACE(Interface)                                                    \
    ((Interface 
*)QueryInterface(IID_##Interface,VER_##Interface))

#define GET_OBJECT_INTERFACE(Object,Interface)                                            \
    ((Interface 
*)Object.QueryInterface(IID_##Interface,VER_##Interface))

#define GET_OBJECTPTR_INTERFACE(pObject,Interface)                                        \
    ((pObject
==NULL)?NULL:((Interface *)pObject->QueryInterface(IID_##Interface,VER_##Interface)))

//////////////////////////////////////////////////////////////////////////


//鎺ュ彛鏌ヨ
void * __cdecl CEventService::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
    QUERYINTERFACE(IEventService,Guid,dwQueryVer);
    QUERYINTERFACE_IUNKNOWNEX(IEventService,Guid,dwQueryVer);
    
return NULL;
}


鐢變簬榪欎釜鍑芥暟鐨勫瓨鍦紝鏄殑鎺ュ彛浼犻掔殑綾誨瀷媯鏌ョ敱緙栬瘧鏈熻漿鍒頒簡榪愯鏈熴?br />浠繪剰鎺ュ彛鐨勪紶閫掗兘鍙渶瑕佷紶閫掍竴涓狪UnknowEx鎸囬拡錛岀劧鍚庢帴鍙楁柟浣跨敤IUnknowEx鍘誨垽鏂槸鍚︽槸鑷繁闇瑕佺殑鎺ュ彛銆?br />榪欎釜鏈哄埗鏄ソ鏄潖錛岄毦璇達紝錛岋紝

Enic 2011-06-10 12:30 鍙戣〃璇勮
]]>
鏈嶅姟寮曟搸姒傝http://www.shnenglu.com/Error/articles/148411.htmlEnicEnicFri, 10 Jun 2011 03:57:00 GMThttp://www.shnenglu.com/Error/articles/148411.htmlhttp://www.shnenglu.com/Error/comments/148411.htmlhttp://www.shnenglu.com/Error/articles/148411.html#Feedback1http://www.shnenglu.com/Error/comments/commentRss/148411.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148411.html

鏈嶅姟寮曟搸榪欐槸綆鍗曠殑鑱氬悎浜嗗叾浠栫殑瀛愭ā鍧楋紝鐒跺悗鍦⊿tart涓仛浜涘垵濮嬪寲鐨勫伐浣溿?img src ="http://www.shnenglu.com/Error/aggbug/148411.html" width = "1" height = "1" />

Enic 2011-06-10 11:57 鍙戣〃璇勮
]]>
寮傛寮曟搸http://www.shnenglu.com/Error/articles/148355.htmlEnicEnicThu, 09 Jun 2011 08:40:00 GMThttp://www.shnenglu.com/Error/articles/148355.htmlhttp://www.shnenglu.com/Error/comments/148355.htmlhttp://www.shnenglu.com/Error/articles/148355.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148355.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148355.html

鏍稿績鎶鏈湪浜庯細鍦ㄦ寚瀹氱殑綰跨▼涓垱寤虹獥鍙o紝鐒跺悗鍚戠獥鍙e彂閫佹秷鎭紝鍦ㄧ獥鍙f秷鎭鐞嗕腑璋冪敤澶栭儴鍥炶皟銆?img src ="http://www.shnenglu.com/Error/aggbug/148355.html" width = "1" height = "1" />

Enic 2011-06-09 16:40 鍙戣〃璇勮
]]>
CEventServicehttp://www.shnenglu.com/Error/articles/148305.htmlEnicEnicWed, 08 Jun 2011 16:13:00 GMThttp://www.shnenglu.com/Error/articles/148305.htmlhttp://www.shnenglu.com/Error/comments/148305.htmlhttp://www.shnenglu.com/Error/articles/148305.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148305.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148305.html鐩稿叧UML錛?br />

綰跨▼瀹夊叏鐨勫仛涓浜涙牸寮忓寲錛岀劧鍚庝竴鑲¤剳杈撳嚭鍒扮獥鍙e彞鏌勪笂錛岋紝錛?br />

Enic 2011-06-09 00:13 鍙戣〃璇勮
]]>
DataBaseEnginehttp://www.shnenglu.com/Error/articles/148282.htmlEnicEnicWed, 08 Jun 2011 10:16:00 GMThttp://www.shnenglu.com/Error/articles/148282.htmlhttp://www.shnenglu.com/Error/comments/148282.htmlhttp://www.shnenglu.com/Error/articles/148282.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148282.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148282.html

浣跨敤鏁版嵁搴撳紩鎿庡繀欏繪寔鏈夋暟鎹簱寮曟搸鍐呴儴闃熷垪錛屽疄鐜版暟鎹簱鍥炶皟鎺ュ彛錛堢敤鏉ュ鐞嗘暟鎹簱鎿嶄綔璇鋒眰錛夛紝鐒跺悗緇撴灉鎶曢掑埌璋冨害寮曟搸闃熷垪銆?br />
鐞嗚В緗戠粶鐙愭鐗岋紝鏈閲嶈鏄悊瑙d袱涓蹇碉細
1錛岄槦鍒楁湇鍔?br />2錛屾帴鍙g殑浼犻?br />
鏅氫笂鍒嗘瀽IEventService錛屾槑澶╁簲璇ヨ兘鎶奍ServiceEngine鎼炲畾 -_+!

Enic 2011-06-08 18:16 鍙戣〃璇勮
]]>
TCPSocketEnging鍒嗘瀽http://www.shnenglu.com/Error/articles/148237.htmlEnicEnicTue, 07 Jun 2011 15:28:00 GMThttp://www.shnenglu.com/Error/articles/148237.htmlhttp://www.shnenglu.com/Error/comments/148237.htmlhttp://www.shnenglu.com/Error/articles/148237.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148237.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148237.html緗戠粶寮曟搸鏁翠綋緇撴瀯錛?br />

SocketItem緇嗚妭錛?br />


鍏堟潵鐪嬪嚑涓簳灞傜粨鏋勶細
//閲嶅彔緇撴瀯綾?/span>
class COverLapped
{
    
//鍙橀噺瀹氫箟
public:
    WSABUF                            m_WSABuffer;                        
//鏁版嵁鎸囬拡
    OVERLAPPED                        m_OverLapped;                        //閲嶅彔緇撴瀯
    const enOperationType            m_OperationType;                    //鎿嶄綔綾誨瀷

    
//鍑芥暟瀹氫箟
public:
    
//鏋勯犲嚱鏁?/span>
    COverLapped(enOperationType OperationType);
    
//鏋愭瀯鍑芥暟
    virtual ~COverLapped();

    
//淇℃伅鍑芥暟
public:
    
//鑾峰彇綾誨瀷
    enOperationType GetOperationType() { return m_OperationType; }
};

//鎺ユ敹閲嶅彔緇撴瀯
class COverLappedSend : public COverLapped
{
    
//鏁版嵁鍙橀噺
public:
    BYTE                            m_cbBuffer[SOCKET_BUFFER];            
//鏁版嵁緙撳啿

    
//鍑芥暟瀹氫箟
public:
    
//鏋勯犲嚱鏁?/span>
    COverLappedSend();
    
//鏋愭瀯鍑芥暟
    virtual ~COverLappedSend();
};

//閲嶅彔緇撴瀯妯℃澘
template <enOperationType OperationType> class CATLOverLapped : public COverLapped
{
    
//鍑芥暟瀹氫箟
public:
    
//鏋勯犲嚱鏁?/span>
    CATLOverLapped() : COverLapped(OperationType) {}
    
//鏋愭瀯鍑芥暟
    virtual ~CATLOverLapped() {}
};


鍏堝涔犱笅鍩虹錛學indows涓嬬殑緗戠粶妯″瀷鏈夊緢澶氱錛岃繖閲屽彧鎷垮嚭涓夌鏉ヨ錛?br />EventSelect錛氬熀浜庝俊鍙鋒満鍒訛紝浠ocket涓哄崟浣嶇粦瀹氫俊鍙烽噺錛屽綋socket涓婃湁鎸囧畾鐨勪簨浠跺彂鐢熸椂嬋鍙戜俊鍙鳳紝鐒跺悗鏌ヨ浜嬩歡澶勭悊浜嬩歡閲嶈浜嬩歡錛岀戶緇湪淇″彿閲忎笂絳夊緟銆傚叾瀹炰篃鏄湪浼厠鍒﹕elect妯″瀷涓婄殑鎹笉鎹㈣嵂鐨勫姞寮恒?br />OverLapped錛氬垎涓ょ宸ヤ綔妯″紡瀹屾垚鍥炶皟錛屽拰瀹屾垚浜嬩歡銆傞噸鍙營O鐩戣姣忔鎿嶄綔錛屾瘡嬈O閮界粦瀹氫竴涓噸鍙犲璞★紝褰撴搷浣滃畬鎴愪互鍚庢縺鍙戜俊鍙鋒垨鑰呰皟鐢ㄥ洖璋冦?br />IOCP錛氬拰overlapped綾諱技錛屼笉榪囩粨鏋滅粡榪囦簡Windows鐨勯澶勭悊浠ラ槦鍒楃殑褰㈠紡鎸傚湪瀹屾垚绔彛涓?br />
鏍規嵁涓婇潰鐨勫涔狅紝鍙互寰楀嚭涓涓粨璁猴紝IOCP鐜涓瘡涓嬈O鎿嶄綔閮介渶瑕佷竴涓噸鍙犵粨鏋勶紝閭d箞涓涓狢ServerSocketItem鑷沖皯闇瑕佸浜涜繖浜涗笢涓滐細
浠栬鎺ュ彈鏁版嵁錛屾墍浠ュ繀欏繪湁涓涓帴鍙楁暟鎹殑 OverLapped
瀹冭鍙戦佹暟鎹紝璇翠互蹇呴』鏈変竴涓彂閫佹暟鎹殑 OverLapped
netFox瀵筄verLapped鍋氫簡浣跨敤浜嗙被浼兼睜鐨勭殑綆$悊鎵嬫錛屼粬鐨凷end閮芥槸涓嶇瓑寰呬笂涓嬈″畬鎴愬氨鐩存帴鎶曢掍笅涓涓姹備簡錛岋紝錛岃繖鏄緢鎿嶈泲鐨勫仛娉曪紝錛岋紝

鐒跺悗緇х畫澶嶄範涓嬪熀紜錛?br />鍦‥ventSelect妯″瀷涓幏澶勭悊浠剁被鍨嬫祦紼嬫槸榪欐牱錛?br />event鍙椾俊錛屼嬌鐢?:WSAEnumNetworkEvents鏌ヨ鍜岃繖涓猠vent鍏寵仈鐨剆ocket鍙戠敓鐨勪簨浠訛紝鏍規嵁鏌ヨ鍒扮殑浜嬩歡綾誨瀷鍘誨鐞嗕簨浠?br />鍦ㄤ互姣忎竴嬈O涓烘煡璇㈠璞¢噸鍙營O銆両OCP妯″瀷涓槸榪欐牱錛?br />浣跨敤GetOverlappedResult 鎴栬?GetQueuedCompletionStatus鐒跺悗鏍規嵁閲嶅彔緇撴瀯鍘繪煡璇㈡姇閫掔殑鏄粈涔堢被鍨嬬殑鎿嶄綔錛岀劧鍚庢壘鍒板叧鑱旂殑socket鍘繪搷浣滐紝錛岋紝

榪欐牱蹇呯劧瑕佺粰OverLapped鍋氫釜鎵╁睍錛屾彁渚涗竴縐嶉氳繃OverLapped鏌ヨ鎿嶄綔綾誨瀷鍜宻ocket鐨勮兘鍔涖?br />閫氳繃鍒嗘瀽浠g爜錛宯etFox鍏寵仈socket鏄氳繃鍦ㄥ垱寤哄畬鎴愮鍙g殑鏃跺欑粦瀹歋ocketItem瀵硅薄鎸囬拡瀹屾垚鐨勶紝鎿嶄綔綾誨瀷鏄氳繃瀵筄verLapped緇撴瀯鍔犲己瀹屾垚鐨勩?br />閫氳繃GetQueuedCompletionStatus鑾峰彇鍒板畬鎴怬verLapped浠ュ悗浣跨敤涓涓畯錛?br />錛堣繖鏄疌OverLapped綾誨瀷錛?nbsp; pSocketLapped=CONTAINING_RECORD(pOverLapped,COverLapped,m_OverLapped);
鏉ヨ幏鍙栧寘瑁呭悗鐨凮verLapped錛岀劧鍚庤幏鍙栨搷浣滅被鍨嬶紝鐒跺悗鎵ц鍏蜂綋鎿嶄綔銆?br />鍏跺疄瀹忕殑灞曞紑濡備笅錛?br />錛圕OverLapped*錛?(BYTE*)pOverLapped - (COverLapped*)(0)->m_OverLapped);
pOverLapped鏄幏鍙栧埌鐨勬煇涓狢OverLapped涓殑鎴愬憳鍙橀噺錛?COverLapped*)(0)->m_OverLapped鏄埌鍦–OverLapped涓殑鍋忕Щ錛?(BYTE*)pOverLapped - (COverLapped*)(0)->m_OverLapped) 灝辨槸鏍規嵁pOverLapped鎺ㄧ畻鍑烘潵鐨勫寘鍚湴鍧涓簆OverLapped浣滀負鎴愬憳鍙橀噺m_OverLapped鐨凜OverLapped瀵硅薄鐨勫湴鍧銆?br />鐒跺悗灝卞垎鍒皟鐢細

//鍙戦佸畬鎴愬嚱鏁?br />bool CServerSocketItem::OnSendCompleted(COverLappedSend * pOverLappedSend, DWORD dwThancferred);

//鎺ユ敹瀹屾垚鍑芥暟
bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred);

涓烘瘺瑕佸尯鍒哠end OverLapped 鍜?Recv OverLapped鍛紝錛岋紝
搴斾負鎶曢掍竴嬈end涓嶄竴瀹氭槸鐬棿瀹屾垚鐨勶紝鍦ㄥ鐞嗙殑榪囩▼涓瓨鍌ㄦ暟鎹殑鍐呭瓨搴旇鏄攣瀹氱殑錛屼篃灝辨槸涓嶅厑璁鎬慨鏀圭殑錛岋紝錛屾墍浠verLapped搴旇鑷繁綆$悊鍐呭瓨銆?br />鑰宺ecv搴旇涔熸槸闇瑕佹湁涓鐗囧唴瀛樼洿鎺ユ帴鍙楁暟鎹殑錛屽緢濂囨猲etFox娌℃湁鎻愪緵錛岋紝錛?br />
recv灞呯劧鏄湪鎶曢掓帴鍙楄姹傜殑鏃跺欑粰浜嗕竴涓┖鐨刡uffer錛岀劧鍚庡湪瀹屾垚鍥炶皟涓嚜宸卞啀嬈¤皟鐢╮ecv鏂規硶鎺ュ彈鏁版嵁銆?br />鎺ュ彈鏈夊叧鐨勬垚鍛樺彉閲忓涓嬶細
    //鐘舵佸彉閲?/span>
protected:
    
bool                            m_bNotify;                            //閫氱煡鏍囧織
    bool                            m_bRecvIng;                            //鎺ユ敹鏍囧織
    bool                            m_bCloseIng;                        //鍏抽棴鏍囧織
    bool                            m_bAllowBatch;                        //鎺ュ彈緹ゅ彂
    WORD                            m_wRecvSize;                        //鎺ユ敹闀垮害
    BYTE                            m_cbRecvBuf[SOCKET_BUFFER*5];        //鎺ユ敹緙撳啿
int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0);
闅鵑亾榪欎箞锠㈢殑鍋氭硶鍙槸涓轟簡韜插紑鍒嗗寘綆楁硶錛?br />鍏蜂綋鐨勭湅鐪嬫帴鍙椾唬鐮侊細
//鎺ユ敹瀹屾垚鍑芥暟
bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred)
{
    
//鏁堥獙鏁版嵁
    ASSERT(m_bRecvIng==true);

    
//璁劇疆鍙橀噺
    m_bRecvIng=false;
    m_dwRecvTickCount
=GetTickCount();

    
//鍒ゆ柇鍏抽棴
    if (m_hSocket==INVALID_SOCKET)
    {
        CloseSocket(m_wRountID);
        
return true;
    }

    
//鎺ユ敹鏁版嵁
    int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0);
    
if (iRetCode<=0)
    {
        CloseSocket(m_wRountID);
        
return true;
    }

    
//鎺ユ敹瀹屾垚
    m_wRecvSize+=iRetCode;
    BYTE cbBuffer[SOCKET_BUFFER];
    CMD_Head 
* pHead=(CMD_Head *)m_cbRecvBuf;

    
//澶勭悊鏁版嵁
    try
    {
        
while (m_wRecvSize>=sizeof(CMD_Head))
        {
            
//鏁堥獙鏁版嵁
            WORD wPacketSize=pHead->CmdInfo.wDataSize;
            
if (wPacketSize>SOCKET_BUFFER) throw TEXT("鏁版嵁鍖呰秴闀?/span>");
            
if (wPacketSize<sizeof(CMD_Head)) throw TEXT("鏁版嵁鍖呴潪娉?/span>");
            
if (pHead->CmdInfo.cbMessageVer!=SOCKET_VER) throw TEXT("鏁版嵁鍖呯増鏈敊璇?/span>");
            
if (m_wRecvSize<wPacketSize) break;

            
//鎻愬彇鏁版嵁
            CopyMemory(cbBuffer,m_cbRecvBuf,wPacketSize);
            WORD wRealySize
=CrevasseBuffer(cbBuffer,wPacketSize);
            ASSERT(wRealySize
>=sizeof(CMD_Head));
            m_dwRecvPacketCount
++;

            
//瑙i噴鏁版嵁
            WORD wDataSize=wRealySize-sizeof(CMD_Head);
            
void * pDataBuffer=cbBuffer+sizeof(CMD_Head);
            CMD_Command Command
=((CMD_Head *)cbBuffer)->CommandInfo;

            
//鍐呮牳鍛戒護
            if (Command.wMainCmdID==MDM_KN_COMMAND)
            {
                
switch (Command.wSubCmdID)
                {
                
case SUB_KN_DETECT_SOCKET:    //緗戠粶媯嫻?/span>
                    {
                        
break;
                    }
                
defaultthrow TEXT("闈炴硶鍛戒護鐮?/span>");
                }
            }
            
else 
            {
                
//娑堟伅澶勭悊
                m_pIServerSocketItemSink->OnSocketReadEvent(Command,pDataBuffer,wDataSize,this);            
            }

            
//鍒犻櫎緙撳瓨鏁版嵁
            m_wRecvSize-=wPacketSize;
            MoveMemory(m_cbRecvBuf,m_cbRecvBuf
+wPacketSize,m_wRecvSize);
        }
    }
    
catch ()
    { 
        CloseSocket(m_wRountID);
        
return false;
    }

    
return RecvData();
}

榪欐槸榪樻槸鏈夊垎鍖呯畻娉曠殑錛屾葷殑鏉ヨ鎺ュ彈嫻佺▼濡備笅錛?br />鐩存帴浣跨敤recv鎶婃暟鎹帴鍙楀埌SocketItem鐨勭紦鍐插尯涓紝褰撻暱搴﹀ぇ浜嶤MD_HEAD涔嬪悗錛岃繘鍏ュ鐞嗛樁孌碉紝澶勭悊head鏁版嵁鍚勭鍒ゆ柇錛岀劧鍚庡皢鏁版嵁鎵斿嚭鍘伙紝鍐嶈皟鏁寸紦鍐插尯錛岋紝錛?br />
綆鍗曠殑璇達細
Send瀹屽叏涓嶈冭檻鍚屾闂錛屼笉綆′竴涓姴鐨勭綉闃熷垪鎶曢扴end璇鋒眰錛岋紝錛岃繖杈瑰鐞嗛槦鍒椾篃鏄洿鎺end瀹屼簨錛屽畬鍏ㄤ笉鑰冭檻涓婁竴嬈℃槸鍚end鎴愬姛錛岋紝錛?br />Recv鏇存槸鑾悕鍏跺鐨勪嬌鐢ㄥ畬鎴愮鍙g粫涓鍦堣繕鍥炲埌recv鐩存帴鎺ュ彈浜嗭紝錛岋紝

寰堢嫍琛鐨勫仛娉曪紝錛岋紝

鏇存涓嬫垜鑷繁鐙楄鐨勪笉鐞嗚В錛?br />濡傛灉涓涓湇鍔″櫒鎻愪氦浜嗛潪甯稿鐨勯噸鍙犵殑receive鍦ㄦ瘡涓涓繛鎺ヤ笂錛岄偅涔堥檺鍒朵細闅忕潃榪炴帴鏁扮殑澧為暱鑰屽彉鍖栥傚鏋滀竴涓湇鍔″櫒鑳藉棰勫厛浼拌鍙兘浼氫駭鐢熺殑鏈澶у茍鍙戣繛鎺ユ暟錛屾湇鍔″櫒鍙互鎶曢掍竴涓嬌鐢ㄩ浂緙撳啿鍖虹殑receive鍦ㄦ瘡涓涓繛鎺ヤ笂銆傚洜涓哄綋浣犳彁浜ゆ搷浣滄病鏈夌紦鍐插尯鏃訛紝閭d箞涔熶笉浼氬瓨鍦ㄥ唴瀛樿閿佸畾浜嗐備嬌鐢ㄨ繖縐嶅姙娉曞悗錛屽綋浣犵殑receive鎿嶄綔浜嬩歡瀹屾垚榪斿洖鏃訛紝璇ocket搴曞眰緙撳啿鍖虹殑鏁版嵁浼氬師灝佷笉鍔ㄧ殑榪樺湪鍏朵腑鑰屾病鏈夎璇誨彇鍒皉eceive鎿嶄綔鐨勭紦鍐插尯鏉ャ傛鏃訛紝鏈嶅姟鍣ㄥ彲浠ョ畝鍗曠殑璋冪敤闈為樆濉炲紡鐨剅ecv灝嗗瓨鍦╯ocket緙撳啿鍖轟腑鐨勬暟鎹叏閮ㄨ鍑烘潵錛屼竴鐩村埌recv榪斿洖 WSAEWOULDBLOCK 涓烘銆?榪欑璁捐闈炲父閫傚悎閭d簺鍙互鐗虹壊鏁版嵁鍚炲悙閲忚屾崲鍙栧法澶?騫跺彂榪炴帴鏁扮殑鏈嶅姟鍣ㄣ傚綋鐒訛紝浣犱篃闇瑕佹剰璇嗗埌濡備綍璁╁鎴風鐨勮涓哄敖閲忛伩鍏嶅鏈嶅姟鍣ㄩ犳垚褰卞搷銆傚湪涓婁竴涓緥瀛愪腑錛屽綋涓涓浂緙撳啿鍖虹殑receive鎿嶄綔琚繑鍥炲悗浣?鐢ㄤ竴涓潪闃誨鐨剅ecv鍘昏鍙杝ocket緙撳啿鍖轟腑鐨勬暟鎹紝濡傛灉鏈嶅姟鍣ㄦ鏃跺彲棰勮鍒板皢浼氭湁鐖嗗彂鐨勬暟鎹祦錛岄偅涔堝彲浠ヨ冭檻姝ゆ椂鎶曢掍竴涓垨鑰呭涓猺eceive 鏉ュ彇浠i潪闃誨鐨剅ecv鏉ヨ繘琛屾暟鎹帴鏀躲傦紙榪欐瘮浣犱嬌鐢?涓己鐪佺殑8K緙撳啿鍖烘潵鎺ユ敹瑕佸ソ鐨勫銆傦級

婧愮爜涓彁渚涗簡涓涓畝鍗曞疄鐢ㄧ殑瑙e喅WSAENOBUF閿欒鐨勫姙娉曘傛垜浠墽琛屼簡涓涓浂瀛楄妭緙撳啿鐨勫紓姝SARead(...)(鍙傝 OnZeroByteRead(..))銆傚綋榪欎釜璇鋒眰瀹屾垚錛屾垜浠煡閬撳湪TCP/IP鏍堜腑鏈夋暟鎹紝鐒跺悗鎴戜滑閫氳繃鎵ц鍑犱釜鏈塎AXIMUMPACKAGESIZE緙撳啿鐨勫紓姝SARead(...)鍘昏錛岃В鍐充簡WSAENOBUFS闂銆備絾鏄繖縐嶈В鍐蟲柟娉曢檷浣庝簡鏈嶅姟鍣ㄧ殑鍚炲悙閲忋?/p>

鎬葷粨錛?

瑙e喅鏂規硶涓錛?

鎶曢掍嬌鐢ㄧ┖緙撳啿鍖虹殑 receive鎿嶄綔錛屽綋鎿嶄綔榪斿洖鍚庯紝浣跨敤闈為樆濉炵殑recv鏉ヨ繘琛岀湡瀹炴暟鎹殑璇誨彇銆傚洜姝ゅ湪瀹屾垚绔彛鐨勬瘡涓涓繛鎺ヤ腑闇瑕佷嬌鐢ㄤ竴涓驚鐜殑鎿嶄綔鏉ヤ笉鏂殑鏉ユ彁浜ょ┖緙撳啿鍖虹殑receive鎿嶄綔銆?

瑙e喅鏂規硶浜岋細

鍦ㄦ姇閫掑嚑涓櫘閫氬惈鏈夌紦鍐插尯鐨剅eceive鎿嶄綔鍚庯紝榪涙帴鐫寮濮嬪驚鐜姇閫掍竴涓┖緙撳啿鍖虹殑receive鎿嶄綔銆傝繖鏍蜂繚璇佸畠浠寜鐓ф姇閫掗『搴忎緷嬈¤繑鍥烇紝榪欐牱鎴戜滑灝辨昏兘瀵硅閿佸畾鐨勫唴瀛樿繘琛岃В閿併?



///////////
濡傛灉涓涓湇鍔″櫒鍚屾椂榪炴帴浜嗚澶氬鎴風, 瀵規瘡涓鎴風鍙堣皟鐢ㄤ簡璁稿 WSARecv, 閭d箞澶ч噺鐨勫唴瀛樺皢浼氳閿佸畾鍒伴潪鍒嗛〉鍐呭瓨姹? 閿佸畾榪欎簺鍐呭瓨鏃舵槸鎸夌収欏甸潰杈圭晫鏉ラ攣瀹氱殑, 涔熷氨鏄鍗充嬌浣?WSARecv 鐨勭紦瀛樺ぇ灝忔槸 1 瀛楄妭, 琚攣瀹氱殑鍐呭瓨涔熷皢浼氭槸 4k. 闈炲垎欏靛唴瀛樻睜鏄敱鏁翠釜緋葷粺鍏辯敤鐨? 濡傛灉鐢ㄥ畬鐨勮瘽鏈鍧忕殑鎯呭喌灝辨槸緋葷粺宕╂簝. 涓涓В鍐沖姙娉曟槸, 浣跨敤澶у皬涓?0 鐨勭紦鍐插尯璋冪敤 WSARecv. 絳夊埌璋冪敤鎴愬姛鏃跺啀鎹㈢敤闈為樆濉炵殑 recv 鎺ユ敹鍒版潵鐨勬暟鎹? 鐩村埌瀹冭繑鍥?WSAEWOULDBLOCK 琛ㄦ槑鏁版嵁宸茬粡鍏ㄩ儴璇誨畬. 鍦ㄨ繖涓繃紼嬩腑娌℃湁浠諱綍鍐呭瓨闇瑕佽閿佸畾, 浣嗗潖澶勬槸鏁堢巼紼嶄綆.


Enic 2011-06-07 23:28 鍙戣〃璇勮
]]>
TimerEnginehttp://www.shnenglu.com/Error/articles/148204.htmlEnicEnicTue, 07 Jun 2011 07:13:00 GMThttp://www.shnenglu.com/Error/articles/148204.htmlhttp://www.shnenglu.com/Error/comments/148204.htmlhttp://www.shnenglu.com/Error/articles/148204.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148204.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148204.html

CTimerEngine鎴愬憳鍙橀噺錛?br />
    //鐘舵佸彉閲?/span>
    DWORD                                m_dwTimerSpace;                    //鏃墮棿闂撮殧錛岃繖涓煎悗鏉ュ簲璇ユ槸緇欎簡瀹氭椂鍣ㄧ嚎紼?/span>
protected:
    
bool                                m_bService;                        //榪愯鏍囧織
    DWORD                                m_dwTimePass;                    //緇忚繃鏃墮棿
    DWORD                                m_dwTimeLeave;                    //鍊掕鏃墮棿
    CTimerItemPtr                        m_TimerItemFree;                //絀洪棽鏁扮粍
    CTimerItemPtr                        m_TimerItemActive;                //媧誨姩鏁扮粍
榪欎簺鏄垎鏋愬畾鏃跺櫒綰跨▼鍑芥暟闇瑕佷簡瑙g殑鎴愬憳鍙橀噺錛屽叾嬈℃槸綰跨▼鍚屾錛?br />浠庝唬鐮佷腑鍙互鐪嬪嚭鎵鏈夊錛歮_TimerItemActive;  m_TimerItemFree;鐨勬搷浣滈兘鏄湪涓涓嚎紼嬮攣鐨勪繚鎶や箣涓嬬殑銆?br />

瀹氭椂鍣ㄧ嚎紼嬶細
閫氳繃CTimerThread緇曚竴鍦堜互鍚庢渶緇堣寰幆鎵ц鐨勫疄闄呬笂鏄繖涓嚱鏁幫紙m_dwTimerSpace鎺у埗鏈灝忔椂闂達級錛?br />
//瀹氭椂鍣ㄩ氱煡
void CTimerEngine::OnTimerThreadSink()
{
    
//閿佸畾璧勬簮
    CThreadLockHandle LockHandle(&m_ThreadLock);

    
//鍊掕鏃墮棿
    if (m_dwTimeLeave==NO_TIME_LEFT) 
    {
        ASSERT(m_TimerItemActive.GetCount()
==0);
        
return;
    }

    
//鍑忓皯鏃墮棿
    ASSERT(m_dwTimeLeave>=m_dwTimerSpace);
    m_dwTimeLeave
-=m_dwTimerSpace;
    m_dwTimePass
+=m_dwTimerSpace;

    
//鏌ヨ瀹氭椂鍣?/span>
    if (m_dwTimeLeave==0)
    {
        
bool bKillTimer=false;
        tagTimerItem 
* pTimerItem=NULL;
        DWORD dwTimeLeave
=NO_TIME_LEFT;
        
for (INT_PTR i=0;i<m_TimerItemActive.GetCount();)
        {
            
//鏁堥獙鍙傛暟
            pTimerItem=m_TimerItemActive[i];
            ASSERT(pTimerItem
!=NULL);
            ASSERT(pTimerItem
->dwTimeLeave>=m_dwTimePass);

            
//瀹氭椂鍣ㄥ鐞?/span>
            bKillTimer=false;
            
// 榪欎竴琛屽仛浜?-鎿嶄綔
            pTimerItem->dwTimeLeave -= m_dwTimePass;
            
if (pTimerItem->dwTimeLeave==0L)
            {
                
//鍙戦侀氱煡
                m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam);

                
//璁劇疆嬈℃暟
                if (pTimerItem->dwRepeatTimes!=TIMER_REPEAT_TIMER)
                {
                    ASSERT(pTimerItem
->dwRepeatTimes>0);
                    
if (pTimerItem->dwRepeatTimes==1L)
                    {
                        bKillTimer
=true;
                        m_TimerItemActive.RemoveAt(i);
                        m_TimerItemFree.Add(pTimerItem);
                    }
                    
else pTimerItem->dwRepeatTimes--;
                }

                
//璁劇疆鏃墮棿錛屼粠鏂板紑濮嬪掕鏃?/span>
                if (bKillTimer==false) pTimerItem->dwTimeLeave=pTimerItem->dwElapse;
            }

            
//澧炲姞绱㈠紩
            if (bKillTimer==false
            {
                i
++;
                dwTimeLeave
=__min(dwTimeLeave,pTimerItem->dwTimeLeave);
                ASSERT(dwTimeLeave
%m_dwTimerSpace==0);
            }
        }

        
//璁劇疆鍝嶅簲
        m_dwTimePass=0L;
        m_dwTimeLeave
=dwTimeLeave;
    }

    
return;
}

CTimerEngine錛?br />鍚姩涓涓畾鏃跺櫒綰跨▼錛屽驚鐜亶鍘嗗畾鏃跺櫒錛屽鏋滃彂鐜版弧瓚沖嚭鍙戞潯浠剁殑瀹氭椂鍣ㄥ氨鎶曢掍竴涓畾鏃跺櫒娑堟伅鍒癈QueueServiceEvent瀵硅薄銆?br />




Enic 2011-06-07 15:13 鍙戣〃璇勮
]]>
璋冨害寮曟搸鍒濇鍒嗘瀽http://www.shnenglu.com/Error/articles/148169.htmlEnicEnicTue, 07 Jun 2011 01:37:00 GMThttp://www.shnenglu.com/Error/articles/148169.htmlhttp://www.shnenglu.com/Error/comments/148169.htmlhttp://www.shnenglu.com/Error/articles/148169.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/148169.htmlhttp://www.shnenglu.com/Error/services/trackbacks/148169.html闃呰鍏ㄦ枃

Enic 2011-06-07 09:37 鍙戣〃璇勮
]]>
CQueueServiceEvent鍒濇鍒嗘瀽http://www.shnenglu.com/Error/articles/147948.htmlEnicEnicThu, 02 Jun 2011 06:36:00 GMThttp://www.shnenglu.com/Error/articles/147948.htmlhttp://www.shnenglu.com/Error/comments/147948.htmlhttp://www.shnenglu.com/Error/articles/147948.html#Feedback0http://www.shnenglu.com/Error/comments/commentRss/147948.htmlhttp://www.shnenglu.com/Error/services/trackbacks/147948.html

浠g爜鍒嗘瀽錛?br />棣栧厛CQueueServiceEvent榪欎釜鍚嶅瓧寰堟湁璇辨儜錛岋紝錛屼綘鎰熻浠栨槸涓涓簨浠訛紝鍏跺疄涓嶆槸銆傚畠瀹為檯鐨勫姛鑳藉簲璇ユ槸涓涓甫鎵撳寘鍔熻兘鐨勪簨浠墮槦鍒楋紝錛岋紝鎴栬呰鏄竴涓儚鎸囧畾鐨勭被浼糆ventQueue鐨勪笢涓滀腑鎶曢掍簨浠躲備粠鎺ュ彛涓婄湅錛岃繖涓笢涓滆兘鎶曢扵imerEvent  DataBaseEvent  SocketAcceptEvent  SocketReadEvent  SocketCloseEvent
搴斾負瀹冩湰韜寔鏈変竴涓狢QueueService鎸囬拡錛屾墍浠ユ湰韜茍涓嶈礋璐f暟鎹鐞嗭紝鍙礋璐f墦鍖呭茍娣誨姞鍒癈QueueService瀹炰緥涓幓銆?br />
鍏堢湅瀹氭椂鍣ㄤ簨浠訛細
 1    //瀹氭椂鍣ㄤ簨浠?/span>
 2    bool PostTimerEvent(WORD wTimerID, WPARAM wBindParam)
 3    {
 4        //鏁堥獙鍙傛暟
 5        ASSERT(m_pIQueueService!=NULL);
 6        if (m_pIQueueService==NULL) return false;
 7
 8        //緙撳啿閿佸畾
 9        CThreadLockHandle BufferLockHandle(&m_BufferLock);
10
11        //鎶曢掓秷鎭?/span>
12        NTY_TimerEvent * pTimerEvent=(NTY_TimerEvent *)m_cbBuffer;
13        pTimerEvent->wTimerID=wTimerID;
14        pTimerEvent->wBindParam=wBindParam;
15        m_pIQueueService->AddToQueue(EVENT_TIMER,m_cbBuffer,sizeof(NTY_TimerEvent));
16
17        return true;
18    }
鍡摷錛屼唬鐮佽川閲忓緢楂樺搱錛岋紝錛?br />鍏ュ彛閮芥湁鏂█鍦╠ebug闃舵甯姪鏆撮湶閿欒錛屾柇璦涔嬪悗榪樻湁if璇彞鍐嶆鍒ゆ柇錛岃繖鏍峰嵆浣縭elease鐗堟湰閿欒涔熶笉浼氳婕忔帀錛岋紝錛?br />鍏充簬浜嬩歡鐨勫皝瑁咃紝鍦ㄨ繖閲屽叾瀹炲凡緇忓垎灞備簡錛岋紝錛?br />
榪欓噷鏄涓灞傦細
1struct tagDataHead
2{
3    WORD                            wDataSize;                            //鏁版嵁澶у皬
4    WORD                            wIdentifier;                        //綾誨瀷鏍囪瘑
5    DWORD                            dwInsertTime;                        //鎻掑叆鏃墮棿
6}
;
榪欎竴灞傚疄闄呬笂鏄敱CDataStorage璐熻矗鎵撳寘綆$悊錛屽湪CQueueServiceEvent鎵цPostTimerEvent鎿嶄綔鐨勬椂鍊欎細鍦ㄥ唴閮ㄨ皟鐢–QueueService鐨刟dd鏈緇堣皟鐢ㄥ埌CDataStrorage鐨凙dd鏉ユ墦鍖呮暟鎹?榪欓噷鐨勭粨鏋勪篃鏄潪甯稿儚緗戠粶鏁版嵁鍖厊- len -|- type -|- data -|銆?br />鍦ㄦ潵鐪婸ost榪欎竴灞傚仛鐨勬暟鎹墦鍖咃細
1//瀹氭椂鍣ㄤ簨浠?/span>
2struct NTY_TimerEvent
3{
4    WORD                            wTimerID;                            //瀹氭椂鍣?nbsp;ID
5    WPARAM                            wBindParam;                            //緇戝畾鍙傛暟
6}
;
|- len -|- type -|- sub protocl -|銆?br />鍏朵粬浜嬩歡鐨勬墦鍖呰繃紼嬮兘鏄被浼肩殑錛?br />
 1//鏁版嵁搴撹姹備簨浠?/span>
 2struct NTY_DataBaseEvent
 3{
 4    WORD                            wIndex;                                //瀵硅薄绱㈠紩
 5    WORD                            wRoundID;                            //瀵硅薄鏍囪瘑
 6    WORD                            wRequestID;                            //璇鋒眰鏍囪瘑
 7}
;
 8
 9//緗戠粶搴旂瓟浜嬩歡
10struct NTY_SocketAcceptEvent
11{
12    WORD                            wIndex;                                //榪炴帴绱㈠紩
13    WORD                            wRoundID;                            //榪炴帴鏍囪瘑
14    DWORD                            dwClientIP;                            //榪炴帴鍦板潃
15}
;
16
17//緗戠粶璇誨彇浜嬩歡
18struct NTY_SocketReadEvent
19{
20    WORD                            wIndex;                                //榪炴帴绱㈠紩
21    WORD                            wRoundID;                            //榪炴帴鏍囪瘑
22    WORD                            wDataSize;                            //鏁版嵁澶у皬
23    CMD_Command                        Command;                            //鍛戒護淇℃伅
24}
;
25
26//緗戠粶鍏抽棴浜嬩歡
27struct NTY_SocketCloseEvent
28{
29    WORD                            wIndex;                                //榪炴帴绱㈠紩
30    WORD                            wRoundID;                            //榪炴帴鏍囪瘑
31    DWORD                            dwClientIP;                            //榪炴帴鍦板潃
32    DWORD                            dwConnectSecond;                    //榪炴帴鏃墮棿
33}
;


榪樻槸涓鏍鳳紝涓鍙ヨ瘽鎬葷粨CQueueServiceEvent錛?br />綰跨▼瀹夊叏鐨勬帴鍙楀悇縐嶅紓姝ヤ簨浠訛紝騫舵墦鍖呭皝瑁呭ソ浠ュ悗鎻掑叆鍒板叧鑱旂殑鍒跺畾IQueueService涓?





Enic 2011-06-02 14:36 鍙戣〃璇勮
]]>
ServerKernel涓殑IQueueService鎺ュ彛鍒嗘瀽http://www.shnenglu.com/Error/articles/147691.htmlEnicEnicMon, 30 May 2011 08:10:00 GMThttp://www.shnenglu.com/Error/articles/147691.htmlhttp://www.shnenglu.com/Error/comments/147691.htmlhttp://www.shnenglu.com/Error/articles/147691.html#Feedback1http://www.shnenglu.com/Error/comments/commentRss/147691.htmlhttp://www.shnenglu.com/Error/services/trackbacks/147691.html鐩稿叧UML濡備笅錛?br />

娣誨姞錛?br />


澶勭悊



鍏抽敭浠g爜瑙f瀽錛?br />

 1//寮濮嬫湇鍔?/span>
 2bool __cdecl CQueueService::StartService()
 3{
 4    //鏁堥獙鍙傛暟
 5    ASSERT(m_bService==false);
 6    ASSERT(m_hCompletionPort==NULL);
 7    ASSERT(m_pIQueueServiceSink!=NULL);
 8
 9    //寤虹珛瀹屾垚绔彛
10    //! 闇瑕佽拷韙竴涓嬭繖閲岀殑瀹屾垚绔彛鍙ユ焺
11    //! 棣栧厛鍒嗘瀽榪欓噷鐨勫垱寤猴紝INVALID_HANDLE_VALUE琛ㄧず娌℃湁鍏寵仈浠諱綍鏂囦歡鍙ユ焺錛屼篃灝辨槸
12    //! 璇翠笉瀛樺湪鏌愪釜瀹炵幇鏌愪釜鎿嶄綔瀹屾垚浠ュ悗緋葷粺鑷姩緇欒繖涓畬鎴愮鍙ost涓涓畬鎴愭秷鎭殑姒傚康
13    //! 鐒跺悗榪欓噷鐢ㄩ檺鍒跺伐浣滅嚎紼嬫暟鏄?錛屼篃灝辨槸鍚屾剰鏃跺埢鍙細鏈変竴鏉$嚎紼嬪彈鍒板畬鎴愭秷鎭?/span>
14    m_hCompletionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,1);
15    if (m_hCompletionPort==NULL) throw TEXT("闃熷垪瀵硅薄瀹屾垚绔彛鍒涘緩澶辮觸");
16
17    //鍚姩綰跨▼
18    if (m_QueueServiceThread.InitThread(m_hCompletionPort)==falsethrow TEXT("闃熷垪瀵硅薄綰跨▼鍒濆鍖栧け璐?/span>");
19    if (m_QueueServiceThread.StartThead()==falsethrow TEXT("闃熷垪瀵硅薄綰跨▼鍚姩澶辮觸");
20
21    //璁劇疆鍙傛暟
22    m_bService=true;
23
24    return true;
25}

m_QueueServiceThread.InitThread(m_hCompletionPort);
浠栨倓鎮勭殑緇欏畬鎴愮鍙e彞鏌勬墧緇欎簡鏈嶅姟綰跨▼錛屽伓浠幓鐪嬬湅鏈嶅姟綰跨▼鎷胯繖鐜╂剰騫蹭簡鍟ワ紝錛岋紝

//榪愯鍑芥暟
bool CQueueServiceThread::RepetitionRun()
{
    
//鏁堥獙鍙傛暟
    ASSERT(m_hCompletionPort!=NULL);

    
//鍙橀噺瀹氫箟
    DWORD dwThancferred=0;
    OVERLAPPED 
* pOverLapped=NULL;
    CQueueService 
* pQueueService=NULL;

    
//絳夊緟瀹屾垚绔彛
    if (GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pQueueService,&pOverLapped,INFINITE))
    
{
        
//鍒ゆ柇閫鍑?/span>
        if (pQueueService==NULL) return false;

        
//鑾峰彇鏁版嵁
        tagDataHead DataHead;
        
bool bSuccess=pQueueService->GetData(DataHead,m_cbBuffer,sizeof(m_cbBuffer));
        ASSERT(bSuccess
==true);

        
//澶勭悊鏁版嵁
        if (bSuccess==true) pQueueService->OnQueueServiceThread(DataHead,m_cbBuffer,DataHead.wDataSize);

        
return true;
    }


    
return false;
}



縐樺瘑鍦ㄦ錛?br />GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pQueueService,&pOverLapped,INFINITE)
m_hCompletionPort鏄氳繃綰跨▼鍙傛暟浼犻掕繘鏉ョ殑錛?span style="color: #000000">dwThancferred
鍜?span style="color: #000000">pQueueService鏄湪涔嬪墠CQueueService::AddToQueue()涓璓ost榪囨潵鐨勫弬鏁幫紝錛岋紝

//鍔犲叆鏁版嵁
bool __cdecl CQueueService::AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
{
    CThreadLockHandle LockHandle(
&m_ThreadLock);
    m_DataStorage.AddData(wIdentifier,pBuffer,wDataSize);
    PostQueuedCompletionStatus(m_hCompletionPort,wDataSize,(ULONG_PTR)
this,NULL);
    
return true;
}


鏁版嵁緇忚繃瀹屾垚绔彛鍦–QueueServiceThread緇曚竴鍦堜互鍚庝細鍥炲埌CQueueService::OnQueueServiceThread()

//鏁版嵁娑堟伅
void CQueueService::OnQueueServiceThread(const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
{
    ASSERT(m_pIQueueServiceSink
!=NULL);
    
try    
    

        m_pIQueueServiceSink
->OnQueueServiceSink(DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime); 
    }

    
catch ({}
    
return;
}



榪欐牱闃熷垪鏈嶅姟灝卞畬鎴愪簡浠栫殑浣垮懡錛屽皢鎵ц鐨勬秷鎭紝寮傛鐨勪氦緇欐寚瀹氭帴鍙e幓澶勭悊錛岋紝錛?br />

紼嶅悗灝嗗鍒楅槦鍒楁湇鍔″仛涓畯瑙備笂鐨勭殑鍒嗘瀽錛岋紝錛屼笅鐝椂闂村埌錛岋紝錛屽洖鍘葷戶緇紝錛岋紝



鐢ㄤ竴鍙ヨ瘽鏉ユ弿榪癚ueueService妯″潡灝辨槸錛?br />灝嗛槦鍒楃殑鎻掑叆鍜屽鐞嗛氳繃鍏寵仈鍒板畬鎴愮鍙d笂浠ュ疄鐜板湪IOCP綰跨▼姹犵鐞嗕笅寮傛澶勭悊錛?br />Add浠ュ悗鎶曢掑畬鎴愭秷鎭紝鍦ㄥ畬鎴愮鍙d笂鐩戝惉鐨勭嚎紼嬪彈鍒版秷鎭互鍚庤鍙栨暟鎹茍澶勭悊錛?br />



Enic 2011-05-30 16:10 鍙戣〃璇勮
]]>
精品久久香蕉国产线看观看亚洲| 久久伊人色| 国产成人久久激情91 | 久久精品国产亚洲AV大全| 国产欧美一区二区久久| 亚洲精品tv久久久久| 久久国产精品成人片免费| 色综合久久久久综合99| 国产精品久久久久久福利漫画| 思思久久好好热精品国产| 99国产精品久久| 中文字幕无码精品亚洲资源网久久| 精品久久久久久| 久久久噜噜噜久久熟女AA片| 亚洲国产成人久久综合区| 久久国产乱子精品免费女| 国内精品久久久久影院薰衣草| 精品水蜜桃久久久久久久| 精品久久久噜噜噜久久久 | 亚洲成色WWW久久网站| 午夜福利91久久福利| 青青国产成人久久91网| 99999久久久久久亚洲| 无码人妻精品一区二区三区久久| 亚洲人成网站999久久久综合| 国产精品女同一区二区久久| avtt天堂网久久精品| 久久99亚洲网美利坚合众国| 久久99国产精品久久99小说| 青青草原综合久久大伊人导航| 国产成人精品久久亚洲高清不卡 | 国产99久久精品一区二区| 99久久精品国产高清一区二区| 亚洲欧美日韩久久精品第一区| 久久中文字幕人妻丝袜| 久久久久久曰本AV免费免费| 久久亚洲AV无码精品色午夜| 伊人久久大香线蕉av不变影院| 久久天天躁狠狠躁夜夜96流白浆| 婷婷久久久亚洲欧洲日产国码AV | 久久青青草视频|