游戏服务器之数据收发缓存

游戏服务器  的一些数据接收处理,处理的是接收和发送的数据包队列。

以客户端发送到逻辑服务器和逻辑服务器发送到数据服务器为例,

以一个手游服务器的代码为例,来看下底层的一些对网络数据接收的处理。


以逻辑服务器连接数据服务器(服务器之间的连接)为例。

1、网络线程例程

2、接收数据

(1)网络接收数据到接收缓存

(2)拷贝和粘包到处理缓存

3、发送数据

(1)发送缓存区数据到队列

 (2)网络socket发送


1、网络线程例程

CDBManager这个是逻辑服务器作为客户端连接到数据服务器的自定义socket连接类,是个线程类,处理角色数据的存取档。

//例行函数

void CDBManager::SingleRun()//每次逻辑循环的例行逻辑处理函数
{
if (m_boStarted)
{
super::SingleRun();//自定义socket的例行处理(开始时连接过去,发送心跳包,收发数据)
ProcessLoadPlayerData();//处理加载角色数据(1、处理接收数据)
ProcessSavePlayerData();//处理保存角色数据(2、处理发送数据)
}
}

开始时连接过去,发送心跳包,收发数据

VOID CCustomWorkSocket::SingleRun()
{
//接收数据
if ( connected() )
ReadSocket();//网络接收数据到接收缓存区(m_pRecvBuffer->pBuffer接收缓存区,m_pRecvBuffer->nOffset是接收到的长度)

//处理接受到的数据包
if ( connected() )
ProcessRecvBuffers(m_pProcRecvBuffer);

//调用例行函数
OnRun();

//发送数据
if ( connected() && m_bSendData)
{
SendSocketBuffers();
}
}

2、接收数据

(1)网络接收数据到接收缓存

VOID CCustomWorkSocket::ReadSocket()
{
static const int OnceRecvSize = 4096;
int nError;
TICKCOUNT dwCurTick = _getTickCount();

while ( TRUE )
{
//增长接收缓冲区大小
if ( m_pRecvBuffer->nSize - m_pRecvBuffer->nOffset < OnceRecvSize * 2 )
{
size_t nPointer = m_pRecvBuffer->pPointer - m_pRecvBuffer->pBuffer;
m_pRecvBuffer->nSize += OnceRecvSize * 2;
m_pRecvBuffer->pBuffer = (char*)realloc(m_pRecvBuffer->pBuffer, m_pRecvBuffer->nSize);
m_pRecvBuffer->pPointer = m_pRecvBuffer->pBuffer + nPointer;
}
//从套接字读取数据
nError = recv(&m_pRecvBuffer->pBuffer[m_pRecvBuffer->nOffset], OnceRecvSize);
if ( nError <= 0 )
break;

m_pRecvBuffer->nOffset += nError;
m_pRecvBuffer->pBuffer[m_pRecvBuffer->nOffset] = 0;
m_dwMsgTick = dwCurTick;
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值