开发平台: C/C++,在Windows VS2019开发,发布于Linux
项目描述:
从底层搭建的MMO游戏服务器框架,支持C++,U3D,UE客户端。对连接的增删改查管理不会随着连接数的增加而降低性能。单机测试可达1万并发连接。
实现要点:
-
采用 Manager 线程、Accept 线程、Recv 线程三个子线程的模型框架,管理新链接的请求,和数据的收发。Manager 线程派发新的连接请求给 Accept 线程和消息请求给 Recv 线程。利用条件变量实现线程同步。
Manager 线程:在 epoll 上等待,有新的连接请求的时候,唤醒在条件变量上等待的 Accept 线程。有新消息的时候,先把对应连接的文件描述符放进list,唤醒在条件变量上等待的 Recv 线程。
Accept 线程:在条件变量上等待,被唤醒的时候,调用 Event_Accept 模块接收新链接。
Recv 线程:在条件变量上等待,被唤醒的时候,从链表上取文件描述符,然后接收消息。
-
初始化服务器即开辟底层数据的内存池,结合自定义哈希容器。使对连接的增删改查的复杂度不会随着连接数的增加而增加,维持在O(1)。
初始化服务器的时候就开辟好一定数量的 S_CONNECT_BASE 的连接数据结构和,S_CONNECT_INDEX 索引数据结构。通过 accept 的 socketFD,可以找到自定义容器中对应的 S_CONNECT_INDEX ,索引数据结构里存放的是 S_CONNECT_BASE 在自定义容器中的位置。
-
自定义封包解包协议,实现消息头 = 验证 + 包长 + 指令、消息体的数据结构。
消息头 = 【2字节的验证头】 + 【4字节的消息长度】+ 【2字节的指令】
验证头用于安全连接的时候使用。
-
建立安全连接机制,通过MD5码和版本号的比对,建立安全连接。
客户端发来一个MD5码,服务器将 secureCode 和 XorCode 组合生成的MD5码与之比对,再加上版本号的比对。即可形成安全连接。发回给客户端一个结果包。
-
实现玩家同步机制,将玩家的变更信息随时同步到其他玩家,离开的玩家数据机构进入对象回收池,减少对象的构造和析构带来的开销。
思维导图:
目录:
myserver:存放业务层代码
core:存放框架代码
public:存放读取配置文件的入口