【问题标题】:Recommended patterns for writing asynchronous evented servers in C用 C 编写异步事件服务器的推荐模式
【发布时间】:2011-05-05 16:33:04
【问题描述】:

我正在用 C 语言编写我的第一个单线程、单进程服务器,使用 kqueue() / epoll() 来处理异步事件分派。正如人们所预料的那样,与阻塞服务器相比,跟踪控制流要困难得多。

人们是否使用一种通用模式(甚至可能带有名称)来避免回调驱动的协议实现变成一个巨大的纠结毛球?

或者,是否有任何用 C 语言编写的非阻塞服务器,其源代码令人赏心悦目?

任何意见将不胜感激!

更多想法:

很多麻烦似乎来自处理 IO 缓冲的需要。缓冲区填充/排放和单个状态转换之间没有必要的对应关系。缓冲区填充/排水可能对应于 [0, N] 状态转换。)

我看过 libev (docs here),它看起来是一个很棒的工具,还有 libevent,它看起来不那么令人兴奋但仍然有用,但它们都没有真正回答这个问题:我如何管理控制流以一种不是非常不透明的方式。

【问题讨论】:

  • 不太清楚您在寻找什么,当您创建基于事件的系统时,您会将所有内容转换为事件,因此您拥有相同的基本界面,从而大大简化了所有内容。
  • 有IO事件,有协议事件(状态变化)。考虑基于套接字的服务器的情况。 IO 事件意味着“您的 fd 已准备好读取(写入)”。协议事件可能会说“客户端想要将您的状态从 AWAITING_AUTH 更改为 AUTH_STARTED”。但是,我们需要数据才能从 AWAITING_AUTH->AUTH_STARTED 移动。在阻塞服务器的情况下,没什么大不了的;我们只是阻塞,直到我们得到数据。在异步情况下,我们需要一直运行事件循环,直到获得所需的数据,然后触发状态转换。
  • 我可以做到这一点,但不能以接近阻塞服务器的代码透明度的方式。我想知道是否有标准方法或好的代码示例。例如,我正在查看 beanstalkd 中的 prot.c - 这不是世界上最容易理解的事情。
  • 我想在这里使用延续会很有帮助,但是我将不得不找到一个可移植的延续库......blergh。

标签: c asynchronous libevent


【解决方案1】:

您可以尝试使用State ThreadsGNU Portable Threads 之类的东西,这样您就可以像每个连接使用单个线程一样编写代码(实现使用Fibers)。

或者,您可以使用状态机生成器(例如Ragel)构建您的协议实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多