我正在设计一个具有脚本功能的游戏服务器。一般的设计是这样的:
Client connects to Server,
Server initializes Client,
Server sends Client to EventManager (separate thread, uses libevent),
EventManager receives receive Event from Client socket,
Client manages what it received via callbacks.
现在最后一部分对我来说是最棘手的。
目前,我的设计允许我使用一个继承Client
来创建对特定接收事件的回调的类。这些回调在一个列表中进行管理,每次接收到某些内容时,接收到的缓冲区都会经过一个解析过程。如果缓冲区有效,则调用回调函数,它作用于缓冲区中的内容。需要注意的一件事是回调可以传递到脚本引擎,此时无法确定会发生什么。
每次回调完成时,都必须重置当前接收缓冲区等。回调当前没有返回值的能力,因为如前所述,任何事情都可能发生。
发生的情况是,当回调中的某处说 this->disconnect() 时,我想立即断开连接Client
,将其从 中删除EventManager
,最后从 中删除Server
,它也应该最终被破坏并释放内存。但是,在客户端中回调完成后,我仍然有一些代码在运行,因此我无法释放内存。
我应该在设计中改变什么?我应该在Server
哪些检查哪些Client
s 可以自由销毁中进行一些定时事件吗?这会产生我不需要的额外开销吗?回调完成后在堆栈(return -1;
)上运行最少的代码是否仍然可以?
我不知道该怎么做,但我愿意接受全面的设计改造。
提前致谢。