📄 dbsocket.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////
// DBSocket.cpp : implementation file
//
//
//
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CLog.h"
#include "DBSocket.h"
#include "CFightZone.h"
#include "PacketCrypt.h"
#include "ActiveQuest.h"
#include "ServerMem.h"
#include "MapServerSocket.h"
#ifdef DEF_AZIT
#include "AzitManager.h"
#endif
#ifdef DEF_UNIQUEITEM
#include "UniqueManager.h"
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
WORD MAPSERVER_VERSION ;
ONDBTRANSFUNC OnTransFunc[DEF_MAXWORLDPACKET] ;
////////////////////////////////////////////////////////////////////////////////////////
// Extern Value
////////////////////////////////////////////////////////////////////////////////////////
extern HANDLE g_hIOCP ;
extern HWND g_MainHwnd;
extern _LPCFIGHTZONEMANAGER g_lpFightzoneManager ;
extern MapServerSocket *g_pServer;
extern _LPDBSOCK g_lpDBSock; // 2003.08.04 Duke Kim
extern Map *g_pMap; // MAP 包府 (User捞悼)
extern ServerMem *g_pServerMem;
extern BaseData g_Base; // Data Base 包访 //Jason 2004-06-01
extern _LPCLOGMANAGER g_lpLog ; // Log
////////////////////////////////////////////////////////////////////////////////////////
// IO 肯丰等饶 贸府窍绰 Thread
////////////////////////////////////////////////////////////////////////////////////////
unsigned __stdcall WorldServer_IOReadCompletedThread(LPVOID lpVoid)
{
_LPDBSOCK pDBServer = (_LPDBSOCK)lpVoid;
if( pDBServer )
{
pDBServer->WorkReadCompleted();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// 荤侩瞪 函荐甸阑 檬扁拳 矫糯
//
//
////////////////////////////////////////////////////////////////////////////////////////
DBSocket::DBSocket()
{
m_nNowSocketNum = 0;
for( int i=0; i < MAX_WORLD_SOCKET; i ++ )
{
m_bSocketStatus[i] = false; // SOCKET狼 楷搬 惑怕
m_Socket[i] = NULL; // Connected Socket
m_SocketFD[i] = NULL; // Socket FD
}
m_pWorldIOPool = NULL; // IO
m_dwThreadCount = 0; // 角 iocp work thread 肮荐
m_hReadEventCompleted = NULL; // IO 肯丰登菌澜阑 舅覆
m_listReadCompleted.RemoveAll(); // 肯丰等 IO 钮, 贸府甫 扁促赴促.
// m_RecoveryList.RemoveAll(); // Recovery List
}
////////////////////////////////////////////////////////////////////////////////////////
// 1. Memory Free 何盒阑 犬牢
//
// - 包访 风凭阑 埃家拳 矫糯
////////////////////////////////////////////////////////////////////////////////////////
DBSocket::~DBSocket()
{
DWORD i;
// --------------------------------------------------------------------------------
// 佬绊 乐绰 颇老捞 乐阑锭
// --------------------------------------------------------------------------------
if( m_listReadCompleted.GetCount() > 0 )
{
POSITION pos = m_listReadCompleted.GetHeadPosition();
while( pos )
{
ReleaseIOContext((_LPPER_BULK_IO_CONTEXT)m_listReadCompleted.GetNext(pos));
}
}
for(i=0; i < MAX_WORLD_SOCKET; i ++ )
{
if(m_SocketFD[i])
ReleaseSocketContext(m_SocketFD[i] ) ;
}
CLOSEEVENT(m_hReadEventCompleted);
m_listReadCompleted.RemoveAll();
SAFE_DELETE< CMemPool<_PER_BULK_IO_CONTEXT> > (&m_pWorldIOPool) ;
SAFE_DELETE <CFightzoneManager> (&g_lpFightzoneManager) ;
SocketPool_Delete(); // Delete Socket Pool
}
////////////////////////////////////////////////////////////////////////////////////////
// Initialize
//
// - Create Socket Pool
// - Event
// - Network (UDP)
// - Create Thread
//
// * Error Msg眠啊 矫糯
////////////////////////////////////////////////////////////////////////////////////////
BOOL DBSocket::bInit()
{
/*
* Create Socket Pool
*/
if( !SocketPool_Create() )
{
ErrorMsg("(X) DB Socket Create Socket Pool" );
return FALSE;
}
/*
* Allocation Memory
*/
if( !bMemAlloc() )
{
ErrorMsg("(X) DB Socket Allocation Memory" );
return FALSE;
}
/*
* Event Initialize
*/
if( !InitializeEvent() )
{
ErrorMsg("(X) DB Socket Initialize Event");
return FALSE;
}
/*
* Create Thread
*/
if( !InitializeThread() )
{
ErrorMsg("(X) DB Socket Initialize Thread");
return FALSE;
}
InitFuctionPoint() ;
/*
* World Server Connect
*/
m_nStart = 0;
for(int i=0 ; i < MAX_WORLD_SOCKET; i ++ )
{
if ( !bConnect( i , false ) ) return FALSE ;
m_nStart = 1;
}
//
// 荤捧厘 甘阑 啊瘤绊 乐栏搁 荤捧厘 沥焊甫 焊辰促
//
// - 甘阑 咯矾俺 啊瘤绊 乐绰 版快 巩力啊 乐阑荐 乐澜
//
if (g_pMap->m_bHaveFightzone)
{
WorldSend_FightzoneInfor() ;
}
ErrorMsg("Success to initialize the db socket.");
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// 窃荐 器牢磐俊 秦寸 窃荐甫 殿废矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::InitFuctionPoint()
{
for(int i =0; i < DEF_MAXWORLDPACKET; i++ )
{
OnTransFunc[i].proc = WorldPacket_Nothing;
}
//
// 弥檬 肺弊牢 矫 贸府 Packet
//
OnTransFunc[ZW_PLAYERLOGIN_REP ].proc = WorldPacket_PlayerIn;
OnTransFunc[ZW_PLAYERINVENTORY_REP ].proc = WorldPacket_PlayerInvetory;
OnTransFunc[ZW_PLAYERSKILL_REP ].proc = WorldPacket_PlayerSkill;
OnTransFunc[ZW_QUESTLIST_REP ].proc = WorldPacket_QuestList;
OnTransFunc[ZW_QUESTGLOBALVALUE_REP ].proc = WorldPacket_QuestGlobalValue;
OnTransFunc[ZW_PLAYERLOGOUT_REP ].proc = WorldPacket_PlayerOut; // Player沥焊 DB历厘 饶 World Server肺 何磐 Message 罐澜
OnTransFunc[ZW_PLAYERMAPOUT_REP ].proc = WorldPacket_PlayerMapOut; // Player沥焊 DB历厘 饶 World Server肺 何磐 Message 罐澜
OnTransFunc[ZW_MAPSERVERSTOP ].proc = WorldPacket_MapServerStop; // 辑滚 辆丰 Message备泅
OnTransFunc[ZW_RECOVERYPLAYER_ASK ].proc = WorldPacket_WorldServerRecovery; // World Server 汗备 MODE
OnTransFunc[ZW_PLAYERCLOSE ].proc = WorldPacket_PlayerClose; // World Server俊辑 碍力 Close皋矫瘤甫 罐篮 版快
OnTransFunc[ZW_PARTYCREATE_REP ].proc = WorldPacket_PartyCreate; // PARTY CREATE
OnTransFunc[ZW_PARTYJOIN_REP ].proc = WorldPacket_PartyJoin; // PARTY JOIN
OnTransFunc[ZW_PARTYLEAVE_REP ].proc = WorldPacket_PartyLeave; // PARTY LEAVE
OnTransFunc[ZW_PARTYDELETE_REP ].proc = WorldPacket_PartyDelete; // PARTY DELETE
OnTransFunc[ZW_PARTYREFRESH_REP ].proc = WorldPacket_PartyRefresh; // PARTY REFRESH
OnTransFunc[ZW_PARTYLIST_REP ].proc = WorldPacket_PartyList; // PARTY LIST
OnTransFunc[ZW_PARTYCHAT_ASK ].proc = WorldPacket_PartyChat; // PARTY CHAT
// 2004-10-16 by kuma 颇萍 涅胶飘 混酒乐绰瘤..
OnTransFunc[ZW_PARTYQUESTISALIVE_REP ].proc = WorldPacket_PartyQuestIsAlive; // 颇萍 涅胶飘 角青吝 眉农
// 2004-10-18 by kuma 颇萍 涅胶飘 函版荤亲阑 促弗 甘辑滚俊 舅妨林绰巴 罐绰 何盒
OnTransFunc[ZW_PARTYQUESTMAPCHANGE_REP ].proc= WorldPacket_PartyQuestMapChange; // 颇萍 涅胶飘 函版郴侩 贸府
//
// 辨靛 眠啊 (2003-9-16 badajoa)
//
OnTransFunc[ZW_CREATEGUILD_REP ].proc = WorldPacket_GuildCreate; // 辨靛 积己
OnTransFunc[ZW_JOINGUILD_REP ].proc = WorldPacket_GuildJoin; // 辨靛 曼咯
OnTransFunc[ZW_LEAVEGUILD_REP ].proc = WorldPacket_LeaveGuild; // 辨靛 呕硼
OnTransFunc[ZW_KICKMEMBER_REP ].proc = WorldPacket_KickMember; // 辨靛 碍硼
OnTransFunc[ZW_GUILDINFOR_REP ].proc = WorldPacket_GuildInfor; // 辨靛 沥焊
OnTransFunc[ZW_DISBANDGUILD_ASK ].proc = WorldPacket_GuildDisband; // 辨靛 秦眉
OnTransFunc[ZW_FORCEDISBANDGUILD_ASK ].proc = WorldPacket_GuildForceDisband; // 辨靛 秦眉
OnTransFunc[ZW_GUILDAPPOINTMASTER_REP ].proc = WorldPacket_GuildAppointMaster; // 何 辨靛厘 夸没
OnTransFunc[ZW_FORCEKICKMEMBER_ASK ].proc = WorldPacket_GuildForceKickMember; // 辨靛盔 碍硼
OnTransFunc[ZW_GUILDMARKCHANGE_REP ].proc = WorldPacket_GuildMarkChange; // 辨靛 付农 函版
OnTransFunc[ZW_FORCEGUILDMARKCHANGE ].proc = WorldPacket_GuildForceMarkChange; // 辨靛 付农 函版
OnTransFunc[ZW_GUILDMEMBER_REP ].proc = WorldPacket_GuildMember; // 辨靛 沥焊
OnTransFunc[ZW_GUILDCHANGEEXP_REP ].proc = WorldPacket_GuildChangeExp; // 辨靛 版氰摹
OnTransFunc[ZW_GUILDNOTICESET_REP ].proc = WorldPacket_GuildNoticeSet; // 辨靛 版氰摹
OnTransFunc[ZW_GUILDINFORCHANGE_ASK ].proc = WorldPacket_GuildInforChange; // 辨靛 沥焊
OnTransFunc[ZW_GUILDINFORSERVER_REP ].proc = WorldPacket_GuildInforServer; // 辨靛 沥焊
OnTransFunc[ZW_GUILDSKILL_REP ].proc = WorldPacket_GuildSkill;
#ifdef DEF_GUILDWAR
OnTransFunc[ZW_GUILDWAR_REP ].proc = WorldPacket_GuildWar; // 辨靛傈
OnTransFunc[ZW_GUILDARMISTICE_REP ].proc = WorldPacket_GuildArmistice; // 绒傈 力狼
#endif
//
// 模备 矫胶袍
//
OnTransFunc[ZW_FRIENDREG_REP ].proc = WorldPacket_FriendReg; // 模备 殿废
OnTransFunc[ZW_FRIENDDISMISS_REP ].proc = WorldPacket_FriendDismiss; // 模备 殿废 秦瘤
OnTransFunc[ZW_FRIENDINFOR_REP ].proc = WorldPacket_FriendInfor; // 模备 府胶飘
//
// 硅撇 矫胶袍
//
OnTransFunc[ZW_FIGHTZONELIST_REP ].proc = WorldPacket_FightzoneList; // 荤捧厘 府胶飘
OnTransFunc[ZW_FIGHTZONERESERVE_REP ].proc = WorldPacket_FightzoneReserve; // 荤捧厘 抗距 搬苞
OnTransFunc[ZW_FIGHTZONEMATCHSTART_ASK ].proc= WorldPacket_FightzoneMatchStart ; // 荤捧厘 悼累
OnTransFunc[ZW_NOTICEMSG ].proc = WorldPacket_NoticeMsg; // 傍瘤 荤亲
OnTransFunc[ZW_ITEMSLOTLIST_REP ].proc = WorldPacket_ItemSlot; // 酒捞袍 浇吩 //Jason 2004-06-01
//
// 酒瘤飘 包府 (眠饶 包访 MSG甫 沥府窃)
//
#ifdef DEF_AZIT
OnTransFunc[ZW_AZITSTATUSLIST_REP ].proc = WorldPacket_AzitStatusList; // 酒瘤飘 府胶飘 沥焊
OnTransFunc[ZW_AZITSTATUSUPDATE_REP ].proc = WorldPacket_AzitStatusUpdate; // 酒瘤飘 惑怕 诀单捞飘
OnTransFunc[ZW_AZITWARPROPOSE_REP ].proc = WorldPacket_AzitWarPropose; // 酒瘤飘 脚没 搬苞
OnTransFunc[ZW_AZITINCOME_REP ].proc = WorldPacket_AzitIncome; // 酒瘤飘 荐涝 陛咀
OnTransFunc[ZW_AZITTAXCHANGE_REP ].proc = WorldPacket_AzitTaxChange; // 酒瘤飘 技陛 函版 馆券 蔼
OnTransFunc[ZW_AZITCHANGEGM_REP ].proc = WorldPacket_AzitChangeGM; // 酒瘤飘 沥焊 函版 (GM)
#endif
//
// 辨靛 芒绊
//
#ifdef DEF_GUILDBANK
OnTransFunc[ZW_MENUACTION_REP ].proc = WorldPacket_MenuAction; // 酒瘤飘 府胶飘 沥焊
OnTransFunc[ZW_GUILDINVENTORYLIST_REP ].proc = WorldPakcet_GuildInventoryList; // 辨靛 牢亥配府 沥焊 免仿
OnTransFunc[ZW_GUILDBANKINFO_REP ].proc = WorldPacket_GuildBankInfo; // 辨靛 桂农 沥焊
OnTransFunc[ZW_GUILDBANKGOLDINOUT_REP ].proc = WorldPacket_GuildBankGoldInOut; // 辨靛 芒绊 涝/免仿
OnTransFunc[ZW_GUILDINVENTORYACT_REP ].proc = WorldPacket_GuildInventoryAct; // 辨靛 桂农 牢亥配府
#endif
#ifdef DEF_NPCCARD
OnTransFunc[ZW_NPCCARDINFO_REP ].proc = WorldPacket_NPCCardInfo; // NPC 墨靛 魄概
#endif
#ifdef DEF_GUILDRANKDUB
OnTransFunc[ZW_GUILDRANKDUB_REP ].proc = WorldPacket_GuildRankDub; // NPC 墨靛 魄概
#endif
//
// 蜡聪农 酒捞袍
//
#ifdef DEF_UNIQUEITEM
OnTransFunc[ZW_UNIQUEITEMLIST_REP ].proc = WorldPacket_UniqueItemList; // 蜡聪农 酒捞袍 府胶飘
OnTransFunc[ZW_UNIQUEITEMUPDATE_REP ].proc = WorldPacket_UniqueItemUpdate; // 蜡聪农 酒捞袍 诀单捞飘
#endif
}
////////////////////////////////////////////////////////////////////////////////////////
// Memory allocation
//
// - 2003.08.31 Duke Kim Memory POOL *10 眠啊
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bMemAlloc()
{
#ifdef DEF_NEWREGISTRY
m_pWorldIOPool = new CMemPool<_PER_BULK_IO_CONTEXT>( _Module.m_dwMaxUser );
#else
m_pWorldIOPool = new CMemPool<_PER_BULK_IO_CONTEXT>( MAX_SOCKET_CONTEXT );
#endif
if( !m_pWorldIOPool )
{
ErrorMsg("memory alloc error .1= %d\n",GetLastError());
return false;
}
return true ;
}
////////////////////////////////////////////////////////////////////////////////////////
// Event Module Initialize
////////////////////////////////////////////////////////////////////////////////////////
BOOL DBSocket::InitializeEvent()
{
//
// Create IO Completed
//
m_hReadEventCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);
if( !m_hReadEventCompleted )
{
ErrorMsg(TEXT("Error IOCompletedEvent Create. Error code = %d"),GetLastError());
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// Thread Inistialize
// -----------------------------------------
// 1. IOCP Work Thread
// 2. Accept Work Thread
// 3. Read Work Thread
// 4. Send Work Thread
////////////////////////////////////////////////////////////////////////////////////////
BOOL DBSocket::InitializeThread()
{
//
// IOCP Work Thread
//
unsigned dwThreadID = 0;
SYSTEM_INFO systemInfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -