C++网络库探索(一)

网络开源库

在这里插入图片描述

学之者生,用之者死——ACE历史与简评

ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等。
ACE 是一套重量级的 C++ 网络库,早期版本由 Douglas Schmidt 独自开发,后来有 40 余名学生与工作人员也贡献了大量代码。ACE 的一大特点是融合了 Douglas Schmidt 提出的很多面向对象网络编程的设计模式,并且具有不可思议的跨平台能力。

1.ACE 很难用,非常容易用错。
2. ACE 代码质量不高,更像是一个研究项目,而不是工业界的产品。select/poll的sleep<2ms,busy-waiting、time_val on bit-64
3. 移植性很好,支持我知道的和不知道的很多平台。
4. ACE 过于复杂,甚至比它试图封装的对象更复杂。
结论:复杂、难学、难懂、容易出错。适合作学术研究, 涉及的诸多面向对象设计模式,比如Reactor、Acceptor 、Connector 、Proactor等,后来这些设计模式又被统统定义成pattern。

Muduo

关于Muduo,我大概看了陈硕的源码,不难理解,陈硕博客中有链接和详细信息:https://blog.csdn.net/solstice?t=1
1、one loop per thread + thread pool
2. boost::function+boost::bind代替取代虚函数。
Reactor网络库,采用one loop per thread + thread pool架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范。Muduo也是一个基于事件的非阻塞网络库。
线程库:vector、deque
整数的原子操作, AtomicInt32 和 AtomicInt64
线程,Thread
线程池,ThreadPool
互斥器与条件变量, MutexLock,MutexLockGuard 与 Condition
带调用栈信息 (stack trace) 的异常基类,Exception
仿 Java concurrent 的 BlockingQueue 和 CountDownLatch
Singleton 与 ThreadLocal
在这里插入图片描述
结论:看似挺不错的,用了好多高端黑,但是好像不太适合。它只适用于linux,只考虑局域网通信,只适用于ipv6、只适用于TCP。

libevent

Libevent一个用C语言编写的、轻量级的开源高性能事件通知库,他也是跨平台的。有以下特点:事件驱动,高性能;轻量级,专注于网络(相对于ACE);开放源码,代码相当精炼、易读;跨平台,支持Windows、Linux、BSD和Mac OS;支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;支持I/O,定时器和信号等事件;采用Reactor模式。
libevent、libe都没能摆脱C 语言带来的缺陷:无函数对象、无协程等诸多缺陷。
该系列最成功的作品libuv,使用javascrit中可以解决C语言缺陷问题,是该系列的最新优作。

asio

参考学习网站:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter2.html
在这里插入图片描述
不需要使用线程和锁,可采用多种高级io方式实现异步io
可移植、可拓展、bsd socket API
asio:select、kqueue、poll/epoll、overlapped I/O等机制,实现异步IO模型、tcp/udp
https://www.zhihu.com/question/42159518
接口不友好,容易出错,调试难。
这里对asio的描述不是很多,但是他名声挺好的。我没看过源码,但这两天调研,让我觉得,这是一个很不错的库。陈硕不太看好,它的木多基本是参libevent的,有机会的话,我很想了解asio。

zmq

参考学习网站:https://github.com/anjuke/zguide-cn
zmq是一个messaging library,每一种不同类型的“socket”,都有自己的消息模式。
Connect your code in any language, on any platform.
 Ø  Carries messages across inproc, IPC, TCP, TIPC, multicast.
 Ø  Smart patterns like pub-sub, push-pull, and router-dealer.
 Ø  High-speed asynchronous I/O engines, in a tiny library.
 Ø  Backed by a large and active open source community.
 Ø  Supports every modern language and platform.
 Ø  Build any architecture: centralized, distributed, small, or large.
 Ø  Free software with full commercial support.
Zmq:tcp、ipc、poll
支持四种通信模型:
请求响应模式
在这里插入图片描述
将一组客户端连接到一组服务器。这是一种远程过程调用和任务分发模式。

发布/订阅模式
在这里插入图片描述
将一组发布者连接到一组订阅者。这是一种数据分发模式。
管道模式
在这里插入图片描述
以扇出/扇入模式连接节点,可以有多个步骤,可以有循环。这是一种并行的任务分发和收集模式。
ZeroMQ提供多种消息传输协议,包括TCP,PGM(可靠的多播),进程间通信(IPC) 以及线程间通讯(ITC)。由于内部线程模型,ZeroMQ的性能非常好,通过利用一种自动消息批处理技术,它甚至在吞吐量上超过了TCP的性能。
ZMQ Sockets 是代表异步消息队列的一个抽象,注意,这里的ZMQ socket和POSIX套接字的socket不是一回事,ZMQ封装了物理连接的底层细节,对用户不透明。
传统的POSIX套接字只能支持1对1的连接,而ZMQ socket支持多个Client的并发连接,甚至在没有任何对端(peer)的情况下,ZMQ sockets上也能放入消息;
一条ZMQ消息可以包含多个消息片(multi-part messages),每个消息片都是一个独立zmq_msg_t结构。
ZMQ保证以原子方式传递消息,要么所有消息片都发送成功,要么都不成功。
ZMQ sockets不是线程安全的,因此,不要在多个线程中并行操作同一个sockets。

ZMQ的坏话

https://www.infoq.cn/article/2014/08/zeromq-not-first-choice
nanomsg相比zmq
nanomsg旨在完全符合POSIX标准:套接字表示为int,而不是void指针。更简单的API、函数更符合posix语法和含义。
C而不是C++:使用了侵入式容器而不是C ++ STL容器,更少的内存碎片化、命中效率高。
线程安全、可拔插的协议、iocp的支持
内存和 CPU 使用效率:ZeroMQ 使用一种很简单的 Trie 结构存储和匹配发布 / 订阅服务。nanomsg 则使用一种称为“基数树(radix tree)”的结构来存储订阅,并提供了真正的零复制 API,允许内存从一台机器复制到另一台机器,而且完全不需要 CPU 的参与。
负载均衡算法——ZeroMQ 采用了轮转调度算法。
zmq和nanomsg的区别 https://nanomsg.org/documentation-zeromq.html
可伸缩协议:https://nanomsg.org/gettingstarted/index.html
nanomsg:不易扩展、额外的系统调用等,没有zmq技术成熟。

LCM通信

lcm:10kb/s
低延迟、高宽带低延迟进程间通信、使用UDP组播的高效广播机制、类型安全的消息编组、用户友好的日志记录和播放、没有集中的“数据库”或“集线器” - 对等体直接通信、没有守护进程、几乎没有依赖。
LCM(Lightweight Communications and Marshalling)是一套用于消息传递和数据编组的库和工具的集合,旨在为实时系统提供高带宽和低延迟的消息传递的能力。它提供了一个发布/订阅消息传递模型以及为各种编程语言的应用程序自动生成编/解组代码。
LCM允许多个进程以安全和高性能地方式进行消息的交换。消息是LCM通信的基本单元,开发者可将消息定义为与编程语言无关的数据结构,然后使用LCM提供的lcm-gen工具将自定义的数据结构编译为特定语言的代码。

发布了139 篇原创文章 · 获赞 55 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/97612112