2026/6/9 16:16:40
网站建设
项目流程
网站建设模板制作,wordpress 一键生成app,织梦做的网站怎么上传视频,通州个人做网站概述
NNG 是 nanomsg 的继任版本#xff0c;而 nanomsg 则是流行的 ZMQ #xff08;一个简单好用的传输层#xff0c;像框架一样的一个 socket library#xff09;的 C 重写版。
NNG 将通信使用的协议和传输分离#xff0c;同一个协议可以工作在不同的传输层上#xff…概述NNG 是 nanomsg 的继任版本而 nanomsg 则是流行的 ZMQ 一个简单好用的传输层像框架一样的一个 socket library的 C 重写版。NNG 将通信使用的协议和传输分离同一个协议可以工作在不同的传输层上类似与 TCP/IP 的应用层和传输层的分层同时接口上屏蔽了底层细节统一用字符串 URL 来描述传输模式。这样当使用场景修改时可以通过简单修改 URL 来实现适应极具灵活性。同时如 NNG 描述所言 “light-weight brokerless messaging”NNG 中的通信各方是不需要第三方程序介入的这与 MQTT/Redis 通信需要服务器不同。这样很适合作为通信库来使用而没有其他依赖。以下是一些 nng 的主要特点协议独立性 nng 提供了多种通信模式协议如请求-回复、发布-订阅、推送-拉取等。每种模式都有相应的协议使开发人员能够根据应用程序的需求选择适当的通信方式。轻量级 nng 的设计着重于保持轻量级和高性能。它专注于提供基本的通信机制避免过多的复杂性。可扩展性 nng 允许开发人员在需要的时候添加新的传输协议以适应不同的通信需求。这使得 nng 在不同的场景中都能够发挥作用。错误处理和可靠性 nng 设计了更好的错误处理机制以便在通信出现问题时更好地报告和处理错误。它还提供了一些协议如 REQ/REP以实现可靠的请求和回复模式。异步通信 nng 支持异步通信模式使开发人员能够实现高效的并发操作。跨平台 nng 可在多个操作系统上运行包括 Linux、Windows 和 macOS。通信协议PAIR 一对一双向通信。PIPELINE(PUSH/PULL) 单向通信类似与生产者消费者模型的消息队列。PUB/SUB 单向广播。REQ/REP 请求-应答模式类似与 RPC 模式。BUS 网状连接通信每个加入节点都可以发送/接受广播消息。SURVEY 用于多节点表决或者服务发现。传输模式inproc 进程内线程间传输ipc 主机内进程间传输tcp 网络内主机间传输通讯模式不同机器进程间TCP - network transport via TCPWS - websockets over TCP服务端”tcp://*:5555”客户端”tcp://localhost:5555”同台机器进程间IPC - transport between processes on a single machineipc:///tmp/reqrep.ipc INPROC - transport within a process (between threads, modules etc.)同进程的线程模块间通信“inproc://rot13”通信协议里除了 PAIR 之外基本都是一对多的通信模式这点需要注意。以 PIPELINE 和 PUB/SUB 为例PIPELINE 的 PUSH 端是 client一个 PUSH 可以连接多个 PULL 端发送数据时会选择其中一个可用的发送PULL 端是 server一个 PULL 可以接收多个 PUSH 连接和数据。PUB/SUB 的 SUB 端是 client一个 SUB 可以连接多个不同的 PUB 端接收多个 PUB 端广播的数据PUB 端是 server一个 PUB 可以接收多个 SUB 连接并广播数据。基于以上多个程序是没办法共用一个 PUB/SUB 通道来广播数据的这与 ROS 里的 topic 和 LCM 中的 channel 模式不同。如果要实现类似功能则可以使用 PIPELINE PUB/SUB 来处理独立一个话题发布的程序拥有一个 PULL 和 PUB。PULL 约定一个 URL所有需要发布该话题的程序都 PUSH 数据到该 URL 上。PUB 约定一个 URL所有需要获取该话题的程序都 SUB 到该 URL 上。程序内部循环将 PULL 读取的数据发送到 PUB 上。以上则可以模拟出 ROS topic 数据合并 或者 LCM 中 channel 的类似功能。整体上看NNG 的 API 很简约主要是 4 个open/recv/send/closeopen 根据协议不同使用的函数会不同。配置则是 setopt/getopt与 UNIX API 类似。API 中没有上下文环境context-less依赖只需要一个 nng_socket这种设计和实现方法值得去学习一下初步揣测应该是使用指针值作为handle如果要强制编译器做类型检测则会套上一层 struct如typedef struct { _nng_xxx_socket * p } nng_socket;NNG 协议基本上囊括了常见的通信需求一些特殊的需求也可以通过组合协议来实现比如上面的模拟 ROS topic 或者 LCM channel 的方法。这样一来如果在程序中使用 NNG不管是多进程还是多线程通过设计可以进一步增强模块化同时不乏灵活性。如果环境变化程序不管是由多进程改成多线程还是由多线程改成多主机都很容易实现。常见模块/进程/线程间通信可以依据具体需求来使用 PIPELINE消息队列 还是 REQ/REP过程调用而不是锁全局变量每个模块单元只需要做单一相关的具体事务无需知晓全局状态。代码结构nng.h:nng对外暴露的 api 接口transport.h:通信层定义主要是为了暴露给用户以实现扩展但目前包含了utils下的相关头文件其中inproc.h/ipc.h/tcp.h是对应的transportprotocol.h:协议层定义也是为了暴露给用户以实现扩展其中reqrep.h/pubsub.h/bus.h/pair.h/pipeline.h/survey.h是对应的protocolutils/:实用工具包包含基本数据结构(list/queue/hash)、互斥及原子操作(mutex/atomic)等transports/:通信层实现包括(inproc:进程内通信ipc:进程间通信tcptcp通信)protocols/:协议层实现包括(REQREP:请求响应PUBSUB:订阅发布等)core/:通用代码aio/:线程池模拟的异步操作带状态机的事件驱动等数据传输发送数据nng_sendmsgnng_aio_set_timeoutnng_aio_set_msgnng_send_aionni_aio_get_msgnni_sock_findnni_sock_send -- sock_sendnni_sock_relenng_aio_waitnng_aio_result显示详细信息接收数据nng_recvmsgnng_aio_set_timeoutnng_recv_aionni_sock_findnni_sock_recv -- sock_recvnni_sock_relenng_aio_waitnng_aio_resultnng_aio_free显示详细信息AIOAIO状态AIO 结构可以携带最多 4 个不同的输入值最多 4 个不同的输出值以及最多 4 个不同的“私有状态”值。 输入和输出的含义由被调用的 I/O 函数决定。typedef enum {NNG_INIT_RECV 0,NNG_RECV_RET_SEND,NNG_SEND_RET_RECV,NNG_RECV_RET_RECV,} nng_aio_state_t;NNG协议 - g0ats Blog