c++ - 使用 C++ 进行事件驱动的客户端/服务器设计

标签 c++ client event-driven

我正在设计一个具有脚本功能的游戏服务器。总体设计如下:

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 可以自由销毁?这会产生我不需要的额外开销吗?回调完成后在堆栈上运行最少的代码 (return -1;) 是否仍然可以?

我不知道该怎么做,但我愿意接受完整的设计改造。

提前致谢。

最佳答案

您可以使用像 boost::shared_ptr<> 这样的引用计数指针以简化内存管理。如果经理的客户列表使用 shared_ptr s 和调用回调的代码创建了 shared_ptr 的本地拷贝回调被调用,对象将保持事件状态,直到它从管理器中删除并且回调函数完成:

class EventManager {
  std::vector< boost::shared_ptr<Client> > clients;

  void handle_event(Event &event) {
    // local |handler| pointer keeps object alive until end of function, even
    // if it removes itselfe from |clients|
    boost::shared_ptr<Client> handler = ...;
    handler->process(event);
  }
};

class Client {
  void process(Event &event) {
    manager->disconnect(this);
    // the caller still holds a reference, so the object lives on
  }
}

Client对象将在最后一个 shared_ptr 后自动删除它超出了范围,但之前没有。因此,创建 shared_ptr 的本地拷贝在函数调用之前确保对象不会被意外删除。

关于c++ - 使用 C++ 进行事件驱动的客户端/服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1454455/

相关文章:

c++ - 如何在没有 std::function 和 auto 的情况下定义 lambda 表达式?

java - 使用 OPC UA Java Legacy 连接到 Matrikon 服务器

node.js - RabbitMQ 和 Sails.js

javascript - node.js 在 Web 开发环境中的位置在哪里?

c++ - 跨平台UTF-8 char文件数据编码/解码

c++ - 即时推导

python - Python 中的线程同步

java - Java中的非阻塞(异步)DNS解析

c++ - 为什么在大括号初始化中允许在参数列表中使用额外的逗号?

java - android.os.NetworkOnMainThreadException - 适用于 Android 的 Twitter 客户端