锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
IClientSocketSink涓鑸敤鐢ㄤ簬緗戠粶鏈嶅姟鍣ㄤ箣闂撮氫俊
IAttemperEngineSink鐢ㄤ簬鍜屽鎴風閫氫俊
// logon server
CAttemperEngineSink::OnEventSocketRead
MDM_GP_LOGON //鐧誨綍娑堟伅
SUB_GP_LOGON_ACCOUNTS //甯愬彿鐧誨綍
CMD_GP_LogonByAccounts
SUB_GP_LOGON_USERID //ID 鐧誨綍
CMD_GP_LogonByUserID
SUB_GP_REGISTER_ACCOUNTS //娉ㄥ唽甯愬彿
CMD_GP_RegisterAccounts
// gamer server
CAttemperEngineSink::OnEventSocketRead
MDM_GR_LOGON //鐧誨綍娑堟伅
SUB_GP_LOGON_ACCOUNTS //甯愬彿鐧誨綍
CMD_GP_LogonByAccounts
SUB_GP_LOGON_USERID //ID 鐧誨綍
CMD_GP_LogonByUserID
MDM_GR_USER //鐢ㄦ埛娑堟伅
SUB_GR_USER_SIT_REQ //鍧愪笅妗屽瓙
SUB_GR_USER_LOOKON_REQ //鏃佽妗屽瓙
CMD_GR_UserSitReq
SUB_GR_USER_STANDUP_REQ //璧風珛璇鋒眰
SUB_GR_USER_LEFT_GAME_REQ //寮洪璇鋒眰
SUB_GR_USER_CHAT //鑱婂ぉ娑堟伅
CMD_GR_UserChat
SUB_GR_USER_WISPER //縐佽娑堟伅
CMD_GR_Wisper
SUB_GR_USER_RULE //鐢ㄦ埛瑙勫垯
CMD_GR_UserRule
SUB_GR_USER_INVITE_REQ //閭璇風敤鎴?br /> CMD_GR_UserInviteReq
MDM_GR_MANAGER //綆$悊娑堟伅
SUB_GR_SEND_WARNING: //璀﹀憡娑堟伅
CMD_GR_SendWarning
SUB_GR_LOOK_USER_IP: //鏌ョ湅鍦板潃
CMD_GR_LookUserIP
SUB_GR_KILL_USER: //韙㈠嚭鐢ㄦ埛
CMD_GR_KillUser
SUB_GR_LIMIT_ACCOUNS: //紱佺敤甯愭埛
CMD_GR_LimitAccounts
SUB_GR_SET_USER_RIGHT: //鐢ㄦ埛鏉冮檺
CMD_GR_SetUserRight
SUB_GR_SEND_MESSAGE: //鍙戦佹秷鎭?br /> CMD_GR_SendMessage
SUB_GR_OPTION_SERVER: //鎴塊棿璁劇疆
CMD_GR_OptionServer
MDM_GF_FRAME //妗嗘灦娑堟伅
MDM_GF_GAME //娓告垙娑堟伅
// center server
CAttemperEngineSink::OnEventSocketRead
MDM_CS_SERVER_LIST: //鍒楄〃娑堟伅
SUB_CS_GET_SERVER_LIST: //鑾峰彇鍒楄〃
MDM_CS_SERVER_MANAGER: //鎴塊棿綆$悊
SUB_CS_REG_GAME_SERVER: //鎴塊棿娉ㄥ唽
SUB_CS_UNREG_GAME_SERVER: //娉ㄩ攢鎴塊棿
SUB_CS_SERVER_ONLINE_COUNT: //鏇存柊浜烘暟







)婧愮爜涓彁渚涗簡涓涓畝鍗曞疄鐢ㄧ殑瑙e喅WSAENOBUF閿欒鐨勫姙娉曘傛垜浠墽琛屼簡涓涓浂瀛楄妭緙撳啿鐨勫紓姝SARead(...)(鍙傝 OnZeroByteRead(..))銆傚綋榪欎釜璇鋒眰瀹屾垚錛屾垜浠煡閬撳湪TCP/IP鏍堜腑鏈夋暟鎹紝鐒跺悗鎴戜滑閫氳繃鎵ц鍑犱釜鏈塎AXIMUMPACKAGESIZE緙撳啿鐨勫紓姝SARead(...)鍘昏錛岃В鍐充簡WSAENOBUFS闂銆備絾鏄繖縐嶈В鍐蟲柟娉曢檷浣庝簡鏈嶅姟鍣ㄧ殑鍚炲悙閲忋?/p>
鎬葷粨錛?
瑙e喅鏂規硶涓錛?
鎶曢掍嬌鐢ㄧ┖緙撳啿鍖虹殑 receive鎿嶄綔錛屽綋鎿嶄綔榪斿洖鍚庯紝浣跨敤闈為樆濉炵殑recv鏉ヨ繘琛岀湡瀹炴暟鎹殑璇誨彇銆傚洜姝ゅ湪瀹屾垚绔彛鐨勬瘡涓涓繛鎺ヤ腑闇瑕佷嬌鐢ㄤ竴涓驚鐜殑鎿嶄綔鏉ヤ笉鏂殑鏉ユ彁浜ょ┖緙撳啿鍖虹殑receive鎿嶄綔銆?
瑙e喅鏂規硶浜岋細
鍦ㄦ姇閫掑嚑涓櫘閫氬惈鏈夌紦鍐插尯鐨剅eceive鎿嶄綔鍚庯紝榪涙帴鐫寮濮嬪驚鐜姇閫掍竴涓┖緙撳啿鍖虹殑receive鎿嶄綔銆傝繖鏍蜂繚璇佸畠浠寜鐓ф姇閫掗『搴忎緷嬈¤繑鍥烇紝榪欐牱鎴戜滑灝辨昏兘瀵硅閿佸畾鐨勫唴瀛樿繘琛岃В閿併?


//瀹氭椂鍣ㄤ簨浠?/span>
bool PostTimerEvent(WORD wTimerID, WPARAM wBindParam)
{
//鏁堥獙鍙傛暟
ASSERT(m_pIQueueService!=NULL);
if (m_pIQueueService==NULL) return false;
//緙撳啿閿佸畾
CThreadLockHandle BufferLockHandle(&m_BufferLock);
//鎶曢掓秷鎭?/span>
NTY_TimerEvent * pTimerEvent=(NTY_TimerEvent *)m_cbBuffer;
pTimerEvent->wTimerID=wTimerID;
pTimerEvent->wBindParam=wBindParam;
m_pIQueueService->AddToQueue(EVENT_TIMER,m_cbBuffer,sizeof(NTY_TimerEvent));
return true;
}
struct tagDataHead
{
WORD wDataSize; //鏁版嵁澶у皬
WORD wIdentifier; //綾誨瀷鏍囪瘑
DWORD dwInsertTime; //鎻掑叆鏃墮棿
};
//瀹氭椂鍣ㄤ簨浠?/span>
struct NTY_TimerEvent
{
WORD wTimerID; //瀹氭椂鍣?nbsp;ID
WPARAM wBindParam; //緇戝畾鍙傛暟
};
//鏁版嵁搴撹姹備簨浠?/span>
struct NTY_DataBaseEvent
{
WORD wIndex; //瀵硅薄绱㈠紩
WORD wRoundID; //瀵硅薄鏍囪瘑
WORD wRequestID; //璇鋒眰鏍囪瘑
};
//緗戠粶搴旂瓟浜嬩歡
struct NTY_SocketAcceptEvent
{
WORD wIndex; //榪炴帴绱㈠紩
WORD wRoundID; //榪炴帴鏍囪瘑
DWORD dwClientIP; //榪炴帴鍦板潃
};
//緗戠粶璇誨彇浜嬩歡
struct NTY_SocketReadEvent
{
WORD wIndex; //榪炴帴绱㈠紩
WORD wRoundID; //榪炴帴鏍囪瘑
WORD wDataSize; //鏁版嵁澶у皬
CMD_Command Command; //鍛戒護淇℃伅
};
//緗戠粶鍏抽棴浜嬩歡
struct NTY_SocketCloseEvent
{
WORD wIndex; //榪炴帴绱㈠紩
WORD wRoundID; //榪炴帴鏍囪瘑
DWORD dwClientIP; //榪炴帴鍦板潃
DWORD dwConnectSecond; //榪炴帴鏃墮棿
};


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