几个主要cpp开源网络库的比较

最近要作网络方面的工作,主要的需求就是实现一个Reactor框架!所以花时间研究一下cpp可用的开源的网络库,在所有开源的cpp网络库中,常用的也就是ACE、libevent、l以及Boost.ASIO顺带一提我比较熟悉的libev!

首先说说ACE,第一印象就是“庞大”(20万行的代码),一大堆东西(memory pool、thread pool、定时器、recursive locks)应有尽有了!是一个大型的中间件解决方案。一堆的设计模式,多层构架,使用的时候要考虑好选择哪一层来使用,更关键的是夸平台,我前面I/O聚集和分离解决方案的文章中传输文件描述符的代码就是参照这个里面的代码写地。ACE用起来很象java,但是本不像业务层语言,如果真要用ACE我觉得就不要当作是一个网络库使用,而是一个开发框架(虽然比不上osgi);不然投入和产出比不高,学的太多用的太少! 

libev是一个c语言写成的网络库,这个库我在学校的时候就用过,它封装了linux的epoll(所以可移植性就没有了),代码量少并且很简洁,易究和学习原理,感觉没有什么实际的使用意义。(顺带一提epoll是在活跃链接少的情况下效率高,如果[活跃链接/总链接]大的情况下和select模型没有什么区别,所以epoll适合断连接)。

libevent也是c语言实现的一个网络库,主要的支持*nix平台,后面添加了对windows的ICOP的支持。由于ICOP是一个异步模型,与linux下的poll、epoll以及BSD和AIX的KQueue完全不一样,顺带一提的是select模型可以夸linux,unix,windows。但是为了性能大家都是用条件编译,系统定义的宏可以参照这里:http://sourceforge.net/apps/mediawiki/predef/index.php?title=Operating_Systems#AIX。

Boost.ASIO这个一个异步I/O库,夸平台,其实算是封装了socket的操作,简化了socket程序开发(没有什么特殊要求建议大家使用这个)

一下就层次构架,设计模式和功能做一些区分:

层次构架:

前面说了ACE是多层次结构,ACE的底层是c风格的OS适配层(这里你又看到了软件行业的银弹原则),中间层当然是cpp封装的类,再上层是一些框架包括了(Acceptor, Connector, Reactor, Proator等等),最上层是一些框架上的服务,个人认为ACE就是软件中的艺术品,你可以享受到完美的代码和设计思想。

Boost.ASIO与ACE的构架非常类似(个人觉得不是偶然),底层是OS的适配层,上一层是一些模板类,再上一层模板类的参数化(TCP/UDP),再上一层是服务(只有一种框架为io_service)。

libevent在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务。

从这里看出来我把不同级别的库都放在这里比较,看上去好像没有什么可比性,但是这就是软件开发包选择的基础吧。

设计模式:

ACE使用的设计模式很多,用得最多的应该是Proactor和Reactor。

ASIO提供Proactor框架。

libevent提供Reactor框架。

其实你稍微对这些技术有一些了解,你就可以猜出他们可能的实现。

功能:

ACE提供包含log, IPC, thread pool, memory pool, recursive locks,定时器,配置服务器等(你真是不应该只是把它当作网络库使用)。

Boost的ASIO相对来说比较简单(因为只提供socket操作),但是也提供简单的线程操作。

libevent和libev也只是提供简单的网络封装,你如果要上面ACE提到的那些东西都需要自己实现。


主要的信息来自官方的文档,如果理解有误请大家指正!

你可能感兴趣的:(网络编程)