TrinityCore的数据读写

本文详细解析了游戏服务器的网络通信流程,包括客户端连接、数据读写、协议处理及解包过程,阐述了异步接收连接、协议初始化、数据处理等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读:

_acceptor>AsyncAcceptWithCallback<&OnSocketAccept>()  (Server/WorldSocketMgr.cpp) ==> AsyncAcceptWithCallback()  (Networking/AsyncAcceptor.h,异步接受客户端连接,客户端连上后执行OnSocketAccept回调) ==> BaseSocketMgr::GetSocketForAccept  (通过_acceptor->SetSocketFactory设置该函数) ==> SelectThreadWithMinConnections(选择连接数最小的IO线程去接收) ==>std::tie(socket, threadIndex) = _socketFactory(); (绑定要接收连接的socket和连接数最小的IO线程) ==> _acceptor.async_accept(异步接收连接,客户端连上后执行OnSocketOpen回调) ==>OnSocketOpen(Networking/SocketMgr.h)==>WorldSocket::Start() ==> WorldSocket::CheckIpCallback==> AsyncReadWithCallback(&WorldSocket::InitializeHandler) ==>WorldSocket::InitializeHandler ==> AsyncRead(Networking/Socket.h) ==> Socket<T, Stream>::ReadHandlerInternal ==> ReadHandler ==>  ReadDataHandler(根据前端发过来的包处理对应逻辑) ==> WorldSession::QueuePacket(加入协议包队列,WorldSession::Update会取出,取出是世界逻辑线程调用)  AsyncRead(异步接收下一次前端发过来的包)

游戏服处理前端的发包逻辑过程: sWorld->UpdateSessions(1) (worldserver/Main.cpp) ==> World::UpdateSessions(World/World.cpp) ==> WorldSession::Update(用_recvQueue.next取出前端发送过来的协议包,再进行逻辑处理)

 

写:

Start() (Networking/NetworkThread.h) ==> NetworkThread::Run ==> NetworkThread<SocketType>::Update ==> WorldSocket::Update()  (通过WritePacketToBuffer和QueuePacket将协议包写入队列_writequeue)==> BaseSocket::Update()  (typedef Socket<WorldSocket> BaseSocket,从_writequeue中取出协议包,发送给客户端) 

游戏服发包是通过WorldSession::SendPacket ==> WorldSocket::SendPacket ==> _bufferQueue.Enqueue(通过_bufferQueue.Dequeue取出)

 

协议:

协议初始化OpcodeTable::Initialize() (Server/Protocol/Opcodes.cpp) => ValidateAndSetClientOpcode => new PacketHandler(PacketHandler继承于ClientOpcodeHandler, 如DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptInvite);其中函数原型是void HandleGuildAcceptInvite(WorldPackets::Guild::AcceptGuildInvite& invite),则在PacketHandler中void(WorldSession::*HandlerFunction)(PacketClass&)就是对应这个函数原型,即WorldPackets::Guild::AcceptGuildInvite与PacketClass相对应),PacketClass的call函数将packet参数传进去构造PacketClass,(session->*HandlerFunction)(nicePacket)这里是用PacketClass作为参数传进去

 

 

WorldSocket::ReadDataHandler (default正常处理协议的分支情况,_worldSession->QueuePacket加入_recvQueue的队列),当

WorldSession::Update(当游戏服更新处理逻辑时,用_recvQueue.nex取出协议)

 

解包:  WorldSocket::ReadHandler()

1._headerBuffer.Write(先写入头部)

2.ReadHeaderHandler(根据包头确定包体的大小)

3._packetBuffer.Write(然后写入包体)

4.ReadDataHandler(对包体进行处理)

5._authCrypt.DecryptRecv(解包)

6._worldSession->QueuePacket(加入协议包队列_recvQueue)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值