游戏服务器 的一些数据接收处理,处理的是接收和发送的数据包队列。
以客户端发送到逻辑服务器和逻辑服务器发送到数据服务器为例,
以一个手游服务器的代码为例,来看下底层的一些对网络数据接收的处理。
以逻辑服务器连接数据服务器(服务器之间的连接)为例。
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;
}
}