C++网络库探索(一)_nanomsg的优点-程序员宅基地

技术标签: 网络编程  

网络开源库

在这里插入图片描述

学之者生,用之者死——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工具将自定义的数据结构编译为特定语言的代码。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Vickers_xiaowei/article/details/97612112

智能推荐

1100多份全球各地的数据汇总,这是我目前看到的最全的数据资源_数据资源清单-程序员宅基地

文章浏览阅读380次。前两天一朋友给我发了一个excel文件,说是别人整理的数据资源。打开以后一看,内容太全了,是我目前看到的最全的一份数据资源列表。独乐乐不如众乐乐,分享出来让大家都受益一下吧。先给大家大致看看内容。整个Excel表按照按别,创建了10多个sheet页,每个页面一个数据类别,分别包括Global、Regional、 Country 、Thematic、 Event Disaster、 Type Disaster List、 Conflict 、Imagery、 Physical、 Conserv_数据资源清单

calloc和malloc区别、分析_malloc与calloc相同-程序员宅基地

文章浏览阅读780次。函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别 malloc()函数有一个参数,即要分配的内存空间的大小:void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。void *calloc(_malloc与calloc相同

每天工作计划_算法工作计划-程序员宅基地

文章浏览阅读251次。如果坚持每天刷题3道,就离1200 codeforce不远了这周主要看:数据结构与算法 c++描述这本书_算法工作计划

Python 中的时间处理包datetime和arrow_python datetime的时间戳和arrow的时间戳不一样-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏5次。Python 中的时间处理包datetime和arrow在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年、月、日等# 方法一:today = datetime.date.today() # 1. 获取「今天」first = today.replace(day=1) # 2. 获取当前月的第一天last_month = first - datetime.ti..._python datetime的时间戳和arrow的时间戳不一样

求字符串可匹配的最大长度_最长连续字符匹配-程序员宅基地

文章浏览阅读4.1k次。如:text=“abcdlijkfgd”,query=“abcdefg”,最大匹配为“abcd”_最长连续字符匹配

机器学习 Machine Learning- 吴恩达Andrew Ng 第11~15课总结-程序员宅基地

文章浏览阅读200次。YouTube课程地址https://www.youtube.com/playlist?list=PLOXON7BTL9IW7Ggbc09jLqGmzkwPI4-3V截止2021-5-3, 有112 个视频1. 第11课 Gradient descent intuition, Linear regression with one variableGradient descent intuition 阶梯下降算法介绍:a 表示 learning rate, 学习下降的速度右边的函数 deriv

随便推点

音频播放模块在短视频开发中的方案解决及所需开发环境说明_小视频模块开发方案-程序员宅基地

文章浏览阅读569次。在短视频开发中,音频媒体播放模块是仅次于视频媒体播放的另一大模块,这段源码就是用于解决音频媒体播放问题的方案。音频媒体播放前,主播需用手机等直播设备对音频媒体进行采集,向文件中添加流式信息,通过适当的压缩算法进行压缩,推流至流媒体服务器储存,直到用户点击音频播放的瞬间完成拉流、解码才能进行播放。public void startPlay(ChatMessageBean bean, Stri..._小视频模块开发方案

虚幻UE4中Matinee基础:骨架网格教程_ue4骨骼网格体-程序员宅基地

文章浏览阅读9.1k次,点赞4次,收藏15次。本教程的目标是教你在如何在Matinee中使用骨架网格的一些基础知识。 您将学习如何连接和操纵骨架网格并使骨架网格物体播放动画。_ue4骨骼网格体

linux密码破解与开机加密_lunnx password-程序员宅基地

文章浏览阅读901次。破解登录密码 GRUB:在引导装载程序菜单上,键入[e] 来进入编辑模式。你会面对一个引导项目列表。查找其中类似以下输出的句行: kernel /vmlinuz-2.4.18-0.4 ro root=/dev/hda2按箭头键直到这一行被突出显示,然后按 [e]。你现在可在文本结尾处空一格再添加 single 来告诉 GRUB 引导单用户 Linux 模式。按 [Enter] _lunnx password

[转]Socket send函数和recv函数详解_sendrecvgprs-程序员宅基地

文章浏览阅读760次。转载地址:http://hi.baidu.com/webeta/blog/item/4c04d109fdf21881d1581be8.html 引文:最近在wince5.0的设备上开发网络通信,因socket的send和recv的时间太长,而客户端不需要服务端的响应数据因此突发奇想,是否可以不用调用recv函数而直接去做其他的事情.刚开始使用的时候还成,速度倒是确实有提升.可最近用到一个操作,send函数后立刻就把GPRS网络断开了,服务器端一直无法收到客户端发送的数据,百思不得其解,google到一篇文章_sendrecvgprs

第七章 数组实验-程序员宅基地

文章浏览阅读973次。C语言设计实验报告试验项目:1、一维数组的运用2、二维数组的应用3、字符数组的应用姓名:李小玲  实验地点:514教室  实验时间:2019.5.29一、实验目的与要求7.3.1一维数组的运用实验1:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序实现)1.定义一个一维数组,其大小为10,即它能存放10个数据。2..._c语言数组的应用实验

MyBatis-Configuration-程序员宅基地

文章浏览阅读58次。一、引用properties 配置文件db.propertiesdriver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://192.168.8.136:3306/mybatisusername=rootpassword=rootmybatis-config.xml<!-- 外部 properties 配置文件 -..._mybatis整合configuration