Files
mir_server/server/DBServer/DBNSClient.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

385 lines
11 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
const CNameSyncClient::OnHandleSockPacket CNameSyncClient::NSSockPacketHandlers[] =
{
NULL,
};
CNameSyncClient::CNameSyncClient(CDBServer *lpDBEngine)
:Inherited()
{
m_pDBServer = lpDBEngine;
SetClientName(_T("名称"));
m_NewNameOperateList.setLock(&m_NewNameOperateListLock);
}
CNameSyncClient::~CNameSyncClient()
{
}
jxSrvDef::SERVERTYPE CNameSyncClient::getLocalServerType()
{
return DBServer;
}
LPCSTR CNameSyncClient::getLocalServerName()
{
return m_pDBServer->getServerName();
}
//VOID CNameSyncClient::SendRegisteClient()
//{
// SERVER_REGDATA regData;
//
// ZeroMemory( &regData, sizeof(regData) );
// regData.GameType = SERVER_REGDATA::GT_JianXiaoJiangHu;
// regData.ServerType = getLocalServerType();
// regData.ServerIndex = m_pDBServer->getServerIndex();
// _asncpytA( regData.ServerName, m_pDBServer->getServerName() );
//
// send(&regData, sizeof(regData));
//}
/*
VOID CNameSyncClient::SendKeepAlive()
{
flushProtoPacket(allocProtoPacket(jxInterSrvComm::NameServerProto::cKeepAlive));
}
*/
VOID CNameSyncClient::OnRun()
{
INT_PTR i;
NameOperateData *pNameOP;
TICKCOUNT dwCurTick = _getTickCount();
//如果有新的名称操作数据,则发送数据并追加到操作中列表
if ( m_NewNameOperateList.count() > 0 )
{
m_NewNameOperateList.lock();
//向名称服务器发送新增加的名称操作消息
SendNewNameOperateRequest();
//将新操作的数据添加到才做中的列表中
m_NameOperatingList.addList(m_NewNameOperateList);
m_NewNameOperateList.clear();
m_NewNameOperateList.unlock();
}
//检查每个正在操作的名称请求的状态
//必须降序循环,因为列表中的数据可能被删除
for ( i=m_NameOperatingList.count()-1; i>-1; --i )
{
pNameOP = m_NameOperatingList[i];
//检查超时
if ( dwCurTick >= pNameOP->dwTimeOut )
{
NameOperateTimedOut(pNameOP);
m_NameOperatingList.remove(i);
m_Allocator.FreeBuffer(pNameOP);
}
}
}
VOID CNameSyncClient::OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket)
{
int nId;
NAMESERVER_OPERROR eError;
LPCSTR sName;
INT_PTR nIndex;
int nServerIndex = 0;
NameOperateData *pNameOP;
inPacket >> nServerIndex;
inPacket >> sName;
switch(nCmd)
{
case jxInterSrvComm::NameServerProto::sAllocCharId://申请角色ID返回 TODO 创角不成功,很多情况是这个 NameServer 没有返回这个协议导致的
{
pNameOP = GetNameOperatePtr(NameOperateData::noAllocCharId, sName, &nIndex,nServerIndex);
if ( pNameOP )
{
inPacket >> eError;
inPacket >> nId;
//向网关管理器投递申请角色名称返回的消息
m_pDBServer->getDataServer()->PostCreateActorResult(
pNameOP->nServerIndex, eError, nId, (PCREATEACTORDATA)pNameOP->pData);
m_NameOperatingList.remove(nIndex);
m_Allocator.FreeBuffer(pNameOP);
}
}
break;
case jxInterSrvComm::NameServerProto::sCrossAllocCharId://申请角色ID返回 TODO 创角不成功,很多情况是这个 NameServer 没有返回这个协议导致的
{
pNameOP = GetNameOperatePtr(NameOperateData::noCSAllocCharId, sName, &nIndex,nServerIndex);
if ( pNameOP )
{
inPacket >> eError;
inPacket >> nId;
//向网关管理器投递申请角色名称返回的消息
m_pDBServer->getDataServer()->PostCreateCrossServerActorResult(
pNameOP->nServerIndex, eError, nId, (PCREATEACTORDATA)pNameOP->pData);
m_NameOperatingList.remove(nIndex);
m_Allocator.FreeBuffer(pNameOP);
}
}
break;
case jxInterSrvComm::NameServerProto::sAllocGuildId://申请帮会ID返回
{
pNameOP = GetNameOperatePtr(NameOperateData::noAllocGuildId, sName, &nIndex,nServerIndex);
if ( pNameOP )
{
inPacket >> eError;
inPacket >> nId;
//使用一个包含2个INT的数组[0]保存操作结果,[1]保存帮会ID
PINT_PTR pResult = (PINT_PTR)malloc(sizeof(*pResult) * 2);
pResult[0] = eError;
pResult[1] = nId;
//向数据服务器投递申请帮会ID返回的消息
m_pDBServer->getDataServer()->PostAllocGuildNameResult(
pNameOP->nServerIndex, pResult, pNameOP->allocGuildId.nOPIdent);
m_NameOperatingList.remove(nIndex);
m_Allocator.FreeBuffer(pNameOP);
}
}
break;
case jxInterSrvComm::NameServerProto::sRenameChar://重命名角色返回
{
pNameOP = GetNameOperatePtr(NameOperateData::noRenameChar, sName, &nIndex);
if ( pNameOP )
{
inPacket >> eError;
//向数据服务器投递角色重命名返回的消息
m_pDBServer->getDataServer()->PostRenameCharResult(pNameOP->nServerIndex,
eError, pNameOP->renameChar.nOPIdent);
m_NameOperatingList.remove(nIndex);
m_Allocator.FreeBuffer(pNameOP);
}
}
break;
case jxInterSrvComm::NameServerProto::sRenameGuild://重命名帮会返回
{
pNameOP = GetNameOperatePtr(NameOperateData::noRenameGuild, sName, &nIndex);
if ( pNameOP )
{
m_NameOperatingList.remove(nIndex);
m_Allocator.FreeBuffer(pNameOP);
}
}
break;
}
}
VOID CNameSyncClient::SendNewNameOperateRequest()
{
INT_PTR i, nCount;
NameOperateData *pNameOP;
nCount = m_NewNameOperateList.count();
for ( i=0; i<nCount; ++i )
{
pNameOP = m_NewNameOperateList[i];
//构造通信数据包
switch(pNameOP->nOPType)
{
case NameOperateData::noAllocCharId://申请角色ID
{
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cAllocCharId);
packet << (int)pNameOP->nServerIndex;
packet << pNameOP->sName;
flushProtoPacket(packet);
}
break;
case NameOperateData::noCSAllocCharId://申请跨服角色ID
{
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cCrossAllocCharId);
packet << (int)pNameOP->nServerIndex;
packet << pNameOP->sName;
flushProtoPacket(packet);
}
break;
case NameOperateData::noAllocGuildId://申请帮会ID
{
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cAllocGuildId);
packet << (int)pNameOP->nServerIndex;
packet << pNameOP->sName;
flushProtoPacket(packet);
}
break;
case NameOperateData::noRenameChar://重命名角色
{
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cRenameChar);
packet << pNameOP->renameChar.nCharId;
packet << pNameOP->sName;
flushProtoPacket(packet);
}
break;
case NameOperateData::noRenameGuild://重命名帮会
{
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cRenameGuild);
packet << pNameOP->guildRename.nGuildId;
packet << pNameOP->sName;
flushProtoPacket(packet);
}
break;
default:
break;
}
}
}
CNameSyncClient::NameOperateData* CNameSyncClient::GetNameOperatePtr(
const NameOperateData::eNameOperateType eOPType, LPCSTR sName, OUT PINT_PTR lpIndex,int nServerIndex)
{
INT_PTR i;
NameOperateData *pNameOP;
//检查每个正在操作的名称请求的状态
//必须降序循环,因为列表中的数据可能被删除
for ( i=m_NameOperatingList.count()-1; i>-1; --i )
{
pNameOP = m_NameOperatingList[i];
if ( pNameOP->nOPType == eOPType && !_stricmp(sName, pNameOP->sName) &&
(nServerIndex == -1 || nServerIndex == pNameOP->nServerIndex))
{
if ( lpIndex ) *lpIndex = i;
return pNameOP;
}
}
return NULL;
}
VOID CNameSyncClient::NameOperateTimedOut(const NameOperateData* pNameOP)
{
//构造通信数据包
switch(pNameOP->nOPType)
{
case NameOperateData::noAllocCharId://申请角色ID
{
//向网关管理器投递申请角色名称返回超时的结果
/////m_pDBServer->getGateManager()->PostAllocCharIdResult(pNameOP->allocCharId.nSesionId, neTimedOut, 0);
}
break;
case NameOperateData::noAllocGuildId://申请帮会ID
{
//向数据服务器投递申请帮会ID色超时的结果
//使用一个包含2个INT_PTR的数组[0]保存操作结果,[1]保存帮会ID
PINT_PTR pResult = (PINT_PTR)malloc(sizeof(*pResult) * 2);
pResult[0] = aeTimedOut;
pResult[1] = 0;
m_pDBServer->getDataServer()->PostAllocGuildNameResult(pNameOP->nServerIndex,
pResult, pNameOP->allocGuildId.nOPIdent);
}
break;
case NameOperateData::noRenameChar://重命名角色
{
//向数据服务器投递重命名角色超时的结果
m_pDBServer->getDataServer()->PostRenameCharResult(pNameOP->nServerIndex,
neTimedOut, pNameOP->renameChar.nOPIdent);
}
break;
case NameOperateData::noRenameGuild://重命名帮会
break;
}
}
BOOL CNameSyncClient::PostAllocateCharId(const int nSessionId, const int nServerIndex, LPCSTR sCharName,CREATEACTORDATA *pData)
{
if ( !connected() )
{
OutputMsg(rmError,"PostAllocateCharId fail, name server not connect");
return FALSE;
}
//构造名称操作数据
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
pNameOP->nOPType = NameOperateData::noAllocCharId;
pNameOP->nServerIndex = nServerIndex;
_asncpytA(pNameOP->sName, sCharName);
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
pNameOP->allocCharId.nSesionId = nSessionId;
pNameOP->pData = (void *)pData;
//添加新的名称操作消息
m_NewNameOperateList.lock();
m_NewNameOperateList.add(pNameOP);
m_NewNameOperateList.unlock();
TRACE("%d,%d,%s",nSessionId,nServerIndex,sCharName);
return TRUE;
}
BOOL CNameSyncClient::PostCrossServerAllocateCharId(const int nSessionId, const int nServerIndex, LPCSTR sCharName,CREATEACTORDATA *pData)
{
if ( !connected() )
{
OutputMsg(rmError,"PostCrossServerAllocateCharId fail, name server not connect");
return FALSE;
}
//构造名称操作数据
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
pNameOP->nOPType = NameOperateData::noCSAllocCharId;
pNameOP->nServerIndex = nServerIndex;
_asncpytA(pNameOP->sName, sCharName);
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
pNameOP->allocCharId.nSesionId = nSessionId;
pNameOP->pData = (void *)pData;
//添加新的名称操作消息
m_NewNameOperateList.lock();
m_NewNameOperateList.add(pNameOP);
m_NewNameOperateList.unlock();
TRACE("%d,%d,%s",nSessionId,nServerIndex,sCharName);
return TRUE;
}
BOOL CNameSyncClient::PostAllocateGuildId(const int nServerIndex, LPCSTR sGuildName, const UINT_PTR nOPIdent)
{
if ( !connected() )
return FALSE;
//构造名称操作数据
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
pNameOP->nOPType = NameOperateData::noAllocGuildId;
pNameOP->nServerIndex = nServerIndex;
_asncpytA(pNameOP->sName, sGuildName);
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
pNameOP->allocGuildId.nOPIdent = nOPIdent;
//添加新的名称操作消息
m_NewNameOperateList.lock();
m_NewNameOperateList.add(pNameOP);
m_NewNameOperateList.unlock();
return TRUE;
}
BOOL CNameSyncClient::PostCharRename(const int nCharId, const int nServerIndex, LPCSTR sNewCharName, const UINT_PTR nOPIdent)
{
if ( !connected() )
return FALSE;
//构造名称操作数据
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
pNameOP->nOPType = NameOperateData::noRenameChar;
pNameOP->nServerIndex = nServerIndex;
_asncpytA(pNameOP->sName, sNewCharName);
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
pNameOP->renameChar.nCharId = nCharId;
pNameOP->renameChar.nOPIdent = nOPIdent;
//添加新的名称操作消息
m_NewNameOperateList.lock();
m_NewNameOperateList.add(pNameOP);
m_NewNameOperateList.unlock();
return TRUE;
}