workflow是一个比较轻量化的后端服务框架,支持Linux/Mac/Windows主流平台,其网络模块是框架的核心。在workflow-windows分支上可以看到对windows的IOCP的封装,对于学习windows IOCP网络编程有很好的启发意义。因此,有必要对该网络模块的工作原理进行分析(源码位置:workflow-windows/src/kernel_win/)。
IOCP完成端口主要封装在WinPoller类中,提供网络IO的异步读写,强制唤醒,提前终止等操作。除此之外,WinPoller内部还封装了一个定时器,用于处理延时任务,还支持用户事件转发,用来配合外部任务流的运行。
为进一步了解该网络模块的工作原理,需要理清workflow中的服务框架的组成关系,搞明白一个服务是怎么被拉起的,何时结束的。从官方给出http_server使用教程,可以看到服务启动的整个流程,如下图,显示了WinPoller在workflow网络服务框架中所处的位置,以及一些主要的接口方法。站在Communicator的角度上,可以非常直观地看到对WinPoller的调用过程。
通过WinPoller的put_io接口,可以投递多种不同类型的异步事件,比如读IO事件,写IO事件,建立连接事件,接受连接事件,延时事件(即sleep事件)以及用户自定义事件(即user事件),并可以通过get_io_result拿到就绪的事件,完成异步操作。
WinPoller可以直接拿来作为作为一个核心部件,实现各种网络框架。