TrinityCore框架_网络模块
最近更新:2024-09-23
|
字数总计:737
|
阅读估时:3分钟
|
阅读量:次
- TrinityCore网络模块
- 网络模块的封装
- TrinityCore网络模块应用
TrinityCore网络模块

网络模块的封装
- 目的:
- 可复用
- 定制核心处理流程:解决网络问题的流程
- 层次关系

- AsyncAcceptor
- socket\bind\listen
- 投递异步请求
- 设置接收连接的负载均衡的方法
- NetworkThread
- 开启一个线程,在执行事件循环
- 负责接收新的连接绑定到当前线程的io_ctx上
- 负责更新连接,以1ms的频率进行更新
- Socket
- 读写数据
- 读:异步读
- 写:windows异步写,update只检查是否关闭连接,linux同步写,update需要从队列中取出数据并发送
- 提供Start接口,连接成功后接下来的逻辑处理
- 提供OnClose接口,连接断开后,逻辑处理
TrinityCore网络模块应用
- EchoSession.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #pragma once
#include "server/Socket.h" #include <cstddef>
class EchoSession : public Socket<EchoSession> { typedef Socket<EchoSession> EchoSocket; public: EchoSession(tcp::socket&& socket); void Start() override; bool Update() override;
void SendPacket(const uint8_t* msg, std::size_t len);
protected: void OnClose() override; void ReadHandler() override; };
|
- EchoSession.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include "EchoSession.h" #include "server/MessageBuffer.h" #include <cstddef> #include <iostream> #include <string_view> #include <utility>
EchoSession::EchoSession(tcp::socket&& socket) : Socket(std::move(socket)){}
void EchoSession::Start() { std::string ip_address = GetRemoteIpAddress().to_string(); std::cout << "accept connection from ip address: " << ip_address << std::endl; AsyncRead(); }
bool EchoSession::Update() { return EchoSocket::Update(); }
void EchoSession::OnClose() { std::string ip_address = GetRemoteIpAddress().to_string(); std::cout << "on close connection from ip address: " << ip_address << std::endl; EchoSocket::OnClose(); }
void EchoSession::ReadHandler() { MessageBuffer& packet = GetReadBuffer(); const char* rptr = reinterpret_cast<const char*>(packet.GetReadPointer()); size_t len = packet.GetActiveSize(); std::string_view buf(rptr, len);
size_t pos = buf.find_first_of("\r\n"); if(pos == std::string_view::npos) return;
std::cout << "C:" << std::string(rptr, pos+2); SendPacket(packet.GetReadPointer(), pos); packet.ReadCompleted(pos+2); AsyncRead(); }
void EchoSession::SendPacket(const uint8_t* msg, std::size_t len) { MessageBuffer buf(len+4); buf.Write("S:", 2); buf.Write(msg, len); buf.Write("\r\n", 2); QueuePacket(std::move(buf)); }
|
- EchoSocketMgr.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #pragma once #include "EchoSession.h" #include "server/NetworkThread.h" #include "server/SocketMgr.h" #include <boost/asio/io_context.hpp> #include <utility>
class EchoSocketMgr : public SocketMgr<EchoSession> { typedef SocketMgr<EchoSession> BaseSocketMgr; public: static EchoSocketMgr& Instance() { static EchoSocketMgr instance; return instance; } bool StartNetwork(boost::asio::io_context& ioContext, std::string const& bindIp, uint16_t port, int threadCount=1) override { if(!BaseSocketMgr::StartNetwork(ioContext, bindIp, port, threadCount)){ return false; } _acceptor->AsyncAcceptWithCallback<&EchoSocketMgr::OnSocketAccept>(); return true; } protected: NetworkThread<EchoSession>* CreateThreads() const override { return new NetworkThread<EchoSession>[1]; } static void OnSocketAccept(tcp::socket&& socket, uint32_t threadIndex) { Instance().OnSocketOpen(std::forward<tcp::socket>(socket), threadIndex); } };
#define sEchoSocketMgr EchoSocketMgr::Instance()
|
- main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <boost/asio/io_context.hpp> #include <iostream> #include <memory> #include "EchoSocketMgr.h"
int main() { std::shared_ptr<boost::asio::io_context> io_context = std::make_shared<boost::asio::io_context>(); if(!sEchoSocketMgr.StartNetwork(*io_context,"0.0.0.0", 8989)) { std::cout << "Failed to initialize network" << std::endl; return 1; } io_context->run(); sEchoSocketMgr.StopNetwork(); return 0; }
|
2024-06-13
该篇文章被 Cleofwine
归为分类:
Game