前言
距离第一次发布iocpframework已经三年多了,这期间这款基于windows的网络库经过多次的修改,已经和第一版有非常大的区别了,但是整体思想架构并没有改变,这得益于当初对下载调度器的认识--模块应该是可替换的,这也是后话了。
在阅读本文的时候,希望你能有以下的基础:
- 熟悉C++11 ,auto、decltype、lambda、type_traits、move等
- 熟悉Windows的网络编程、IOCP模型(IOCP仅仅是个异步队列 blocking queue,当然不止一个队列)
如果你符合以下描述,那么恭喜你,本文就是为你而写的:
- 追求自由,热爱自由
- 对网络proactor IO模型细枝末节摸棱两可
- 对IOCP机制感到非常模糊及细节难以把握
- 对C++充满热爱与激情
如果您具有以下特征之一,那么本文可能会给你带来不适,请谅解:
- 披着C++外衣的Cer
- 反模板联盟
- 反感自造轮子
iocpframework的github地址:https://github.com/chenyu2202863/iocpframework/
换句话说,我所走的弯路,你一样得走(哈哈,被坑了),我所路过的捷径,也希望会成为你的捷径。祝你好运。。需要C++11编译期支持,至少VS2012 CTP补丁才能编译
一个迷你的服务器
设置好监听端口,启动。等待accept事件,针对session投递读请求,等待读事件,返回写数据。麻雀虽小五脏俱全,再来看看其中涉及到的设计思考及实现细节。
网络库应该提供的功能:
- 3个半事件,详情请参考陈硕的《网络编程本质论》
- 可扩展的内存分配方式
- 对网络错误处理
- 异步、同步IO
网络库避免限制的决策:
- 对session集中式管理
- 对接收缓冲区与发送缓冲区的强制
- 需要做到协议无关
正如《UNIX编程艺术》所说:提供机制,而不是策略
与第一版的变化:
- 性能大幅度提高
- 接口更加灵活
- 增加socket pool
- 增加zero copy机制
- 增加timewheel
- 不再支持Win XP