nanomsg底层实现逻辑和框架分享

第三方库介绍——nanomsg(高性能通信库) 高性能通信库——nanomsg(含交叉编译) 阅读详情
AI摘要

本文分享了nanomsg底层实现逻辑和框架。nanomsg用C语言编写,适用于多操作系统且依赖少。它提供六种通信协议和四种传输方式,目录结构各子目录负责特定功能模块。还介绍了核心组件类图、状态机和异步处理框架等内容。

nanomsg

Nanomsg是一个Socket的通讯库,使用C语言编写实现的,这样就可以适用于多种操作系统,而且几乎不需要什么依赖,可扩展并且能易于使用。Nanomsg提供了几种常见的通信模式 ( 也称为“可扩展性协议” ) 是构建分布式系统的基本框架。 通过组合它们,可以创建广 泛的分布式应用程序。

目录结构

src
├── aio       异步IO,包含实现异步操作所需的上下文管理、有限状态机、事件轮询器、定时器、统一socket抽象、以及工作线程等组件
├── core      核心功能,包含端点管理、全局状态、管道管理、套接字实现等
├── devices   设备功能,用于桥接不同的通信模式,实现消息的中继和路由
├── protocols 六种通信协议
│   ├── bus      总线模式
│   ├── pair     配对模式
│   ├── pipeline 管道模式
│   ├── pubsub   发布订阅模式
│   ├── reqrep   请求响应模式
│   ├── survey   调查模式
│   └── utils    实现协议层共用功能
├── transports  四种传输层协议
│   ├── inproc  进程内通信,基于内存共享实现
│   ├── ipc     进程间通信,基于域套接字(Linux)或命名管道(Windows)
│   ├── tcp     TCP协议
│   ├── ws      Websocket协议
│   └── utils   实现传输层共用功能
├── utils       系统调用相关封装
├── nn.h        公共API定义
└── protocol.h  协议接口定义

通信协议

Nanomsg提供了六种可扩展协议,每种模式都有特定的消息路由策略,所有协议都是可插拔的。

  • PAIR (配对模式):
    最简单的一对一通信模式。每个端点只能与一个对等端点建立连接,适用于简单的点对点通信场景。
    请添加图片描述

  • BUS (总线模式):
    多对多的网状通信模式。每个节点可以向总线上的所有其他节点广播消息,消息会被传递给除发送者外的所有连接节点。适用于去中心化的网络拓扑,如分布式系统中的服务发现。
    请添加图片描述

  • REQREP (请求-响应模式):
    实现同步请求-响应模式。请求者发送请求后必须等待响应,响应者收到请求后必须回复响应。支持自动重试和负载均衡,适用于RPC、分布式计算等需要双向通信的场景。
    请添加图片描述

  • PIPELINE (管道模式):
    实现单向数据流。由PUSH(推送)和PULL(拉取)两种节点组成,数据只能从PUSH流向PULL。支持负载均衡,适用于数据流处理、任务分发等场景。
    请添加图片描述

  • PUBSUB (发布-订阅模式):
    实现一对多的消息分发。发布者(PUB)发送的消息会被传递给所有订阅者(SUB)。支持基于主题的过滤,订阅者可以选择只接收感兴趣的主题。适用于数据广播、事件通知等场景。
    请添加图片描述

  • SURVEY (调查模式):
    实现一对多的请求-响应模式。调查者(SURVEYOR)发送调查请求,响应者(RESPONDENT)在超时时间内可以回复。适用于服务发现、状态收集等需要汇总多个节点响应的场景。
    请添加图片描述

协议通信方向连接模式消息模式典型应用场景
PAIR双向一对一点对点专用连接、设备控制
BUS双向多对多广播服务发现、状态同步
REQREP双向多对多调查RPC、查询服务
PIPELINE单向多对多负载均衡任务分发、数据流处理
PUBSUB单向一对多广播数据分发、事件通知
SURVEY双向一对多聚合系统监控、配置收集

传输方式

Nanomsg 提供了四种传输方式,处理底层的网络通信细节,可以独立扩展新的传输方式:

  • INPROC (进程内通信):
    INPROC 是用于同一进程内的线程之间通信的传输机制。它通过共享内存实现,速度最快,因为不需要进行上下文切换或网络操作。适用于需要在同一应用程序的不同组件之间快速传递消息的场景。
  • IPC (进程间通信):
    IPC 使用域套接字(在 Linux 上)或命名管道(在 Windows 上)来实现不同进程之间的通信。这种传输机制适用于需要在同一台机器上的不同进程之间传递消息的场景。
  • TCP (TCP网络传输):
    TCP 是一种可靠的、基于连接的协议,适用于需要在不同机器之间进行可靠数据传输的场景。Nanomsg 使用 TCP 来实现跨网络的进程间通信。
  • WS (WebSocket传输):
    WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,通常用于浏览器与服务器之间的通信。Nanomsg 的 WebSocket 传输机制适用于需要与 Web 应用程序进行通信的场景。
传输方式描述使用场景
inproc进程内通信同一进程中的线程间通信,零拷贝优化
ipc进程间通信同一主机上的不同进程间通信
tcpTCP网络传输网络中的跨主机通信,广泛支持
wsWebSocket传输浏览器与服务器通信,跨网络边界

结构解析

在 Nanomsg 的目录结构中,每个子目录都负责特定的功能模块:

  • core:包含 Nanomsg 的核心功能,如端点管理、全局状态管理、管道管理等。这是 Nanomsg 的基础模块,负责管理通信的基本元素。

  • aio:提供异步 I/O 操作的支持,包括事件轮询器、定时器、套接字管理等。异步 I/O 是实现高性能网络通信的关键。

  • protocols:实现了多种消息传递协议,如发布/订阅、请求/响应等,提供了不同的通信模式以满足应用需求。

  • transports:提供了不同的传输机制,如TCP、IPC和WebSocket等,支持在不同网络环境中进行高效的数据传输。

  • devices:实现设备功能,用于在不同的通信模式之间进行桥接,支持消息的中继和路由。

  • utils:提供通用的实用工具函数和类,供其他模块使用。

核心组件类图

请添加图片描述


utils

utils
├── fd.h    跨平台定义fd
├── win.h   导入win平台头文件
├── attr.h  定义GNU编译属性
├── cont.h  宏定义从成员推断结构体地址
├── fast.h  GNU分支优化
|
├── alloc    封装内存分配,提供宏NN_ALLOC_MONITOR用于监视内存分配情况
├── atomic   封装原子变量uint32_t
├── chunk    缓冲区
├── chunkref 缓冲区引用
├── clock    提供毫秒时间戳
├── closefd  关闭文件描述符
├── condvar  封装条件变量
├── efd               eventfd的接口,支持下面四种实现
├── efd_eventfd       
├── efd_pipe          
├── efd_socketpair    
├── efd_win           win下使用socket+tcp实现
├── err      错误处理,提供堆栈信息打印以及平台间适配
├── hash     哈希表实现
├── list     链表实现
├── queue    队列实现
├── msg      消息封装
├── mutex    封装mutex
├── once     封装once
├── random   随机数
├── sem      信号量
├── sleep    休眠
├── stopwatch     时间测量,微秒级别
├── strcasecmp    字符串比较
├── strcasestr    
├── strncasecmp   
├── thread        线程
├── thread_posix  
├── thread_win    
└── wire          字节序转换
  • alloc:
    alloc 模块封装了内存分配的功能,并提供了宏 NN_ALLOC_MONITOR 用于监视内存分配情况。在内存分配的时候会打印内存分配的模块以及大小,能够帮助开发者追踪内存泄漏和不当使用。

    pfd = nn_alloc (sizeof (struct pollfd) * nfds * 2, "pollset");
    
    printf ("Allocating %s (%zu bytes)\n", name/* pollset */, size/* sizeof (struct pollfd) * nfds * 2 */);
    printf ("Current memory usage: %zu bytes in %zu blocks\n",
            nn_alloc_bytes, nn_alloc_blocks);
    
  • cont:

  • 从成员地址反推结构体指针地址

    #define nn_cont(ptr, type, member) \
        (ptr ? ((type*) (((char*) ptr) - offsetof(type, member))) : NULL)
    
    timer = nn_cont (self, struct nn_timer, fsm); // self是nn_timer的成员fsm,返回timer的地址
    
  • chunk 和 chunkref:
    chunk 模块提供了缓冲区的管理,而 chunkref 则允许对缓冲区的引用管理。这种设计使得在处理消息时能够高效地管理内存,避免不必要的复制。


devices

示例代码
test/device.c

nanomsg的设备支持以下几种模式:

  1. 双向设备 (Bidirectional Device):

    • 通过 NN_CHECK_ALLOW_BIDIRECTIONAL 检查,设备可以在两个套接字之间双向传递消息。

    • 代码片段:

      if (device->required_checks & NN_CHECK_ALLOW_BIDIRECTIONAL) {
          if (s1rcv != NN_BAD_FD && s1snd != NN_BAD_FD &&
              s2rcv != NN_BAD_FD && s2snd != NN_BAD_FD)
              return nn_device_twoway (device, s1, s2);
      }
      
  2. 单向设备 (Unidirectional Device):

    • 通过 NN_CHECK_ALLOW_UNIDIRECTIONAL 检查,设备可以在一个方向上传递消息。

    • 代码片段:

      if (device->required_checks & NN_CHECK_ALLOW_UNIDIRECTIONAL) {
          /*  Single-directional device passing messages from s1 to s2. */
          if (s1rcv != NN_BAD_FD && s1snd == NN_BAD_FD &&
              s2rcv == NN_BAD_FD && s2snd != NN_BAD_FD)
              return nn_device_oneway (device, s1, s2);
      
          /*  Single-directional device passing messages from s2 to s1. */
          if (s1rcv == NN_BAD_FD && s1snd != NN_BAD_FD &&
              s2rcv != NN_BAD_FD && s2snd == NN_BAD_FD)
              return nn_device_oneway (device, s2, s1);
      }
      
  3. 环回设备 (Loopback Device):

    • 通过 NN_CHECK_ALLOW_LOOPBACK 检查,设备可以处理单个套接字的环回情况。

    • 代码片段:

      if (device->required_checks & NN_CHECK_ALLOW_LOOPBACK) {
          if (s2 < 0)
              return nn_device_loopback (device, s1);
          if (s1 < 0)
              return nn_device_loopback (device, s2);
      }
      

使用nanomsg的设备(device)时,有几个重要的注意事项:

  1. 套接字类型:

    • 确保使用的套接字类型符合设备的要求。例如,如果设备要求原始套接字(raw sockets),则必须使用 AF_SP_RAW 类型的套接字。

    • 代码片段:

      if (device->required_checks & NN_CHECK_REQUIRE_RAW_SOCKETS) {
          // 检查套接字是否为原始套接字
      }
      
  2. 协议一致性:

    • 确保两个套接字属于同一协议族。不同协议的套接字不能一起使用。

    • 代码片段:

      if (device->required_checks & NN_CHECK_SAME_PROTOCOL_FAMILY) {
          // 检查套接字是否属于同一协议族
      }
      
  3. 方向性检查:

    • 在使用设备时,确保套接字的方向性符合要求。例如,某些设备可能要求一个套接字用于接收,另一个用于发送。

    • 代码片段:

      if (device->required_checks & NN_CHECK_SOCKET_DIRECTIONALITY) {
          // 检查套接字的方向性
      }
      

aio

aio
├── ctx  上下文
├── fsm  状态机
├── poller        IO多路分离器,支持下面三种实现
├── poller_epoll
├── poller_kqueue
├── poller_poll
├── pool          线程池
├── timer
├── timerset      定时器集,管理各种事务
├── usock
├── usock_posix
├── usock_win
├── worker        工作线程
├── worker_posix
└── worker_win
状态机和异步处理框架

nanomsg中几乎所有重要组件都是基于状态机实现的

主要包括这几个核心组件:

  • nn_fsm: 状态机基类,定义了状态转换和事件处理机制
  • nn_fsm_event: 状态机事件,用于组件间通信
  • nn_ctx: 上下文,管理事件队列和工作线程
  • nn_pool: 线程池,包含工作线程
  • nn_worker: 工作线程,负责事件处理
  • nn_ep: 端点,负责管理连接生命周期
核心组件类图

请添加图片描述

异步处理流程图

请添加图片描述

创建端点并连接示例

请添加图片描述

关键协作机制
  1. 事件传递流程:

    • 组件通过nn_fsm_raise触发事件
    • 事件被添加到目标组件上下文的事件队列
    • 工作线程从队列获取事件并处理
  2. 上下文与状态机的绑定:

    • 每个状态机都绑定到一个上下文
    • 子状态机继承父状态机的上下文
    • 上下文提供了事件队列和线程安全机制
  3. 多线程协作:

    • 状态机不关心实际执行的线程
    • 上下文确保同一时间只有一个线程访问状态机
    • 工作线程负责实际的事件处理

protocols

protocols
├── bus
│   ├── bus
│   └── xbus
├── pair
│   ├── pair
│   └── xpair
├── pipeline
│   ├── pull
│   ├── push
│   ├── xpull
│   └── xpush
├── pubsub
│   ├── pub
│   ├── sub
│   ├── trie
│   ├── xpub
│   └── xsub
├── reqrep
│   ├── rep
│   ├── task
│   ├── xrep
│   └── xreq
├── survey
│   ├── respondent
│   ├── surveyor
│   ├── xrespondent
│   └── xsurveyor
└── utils 实现协议层共用功能:优先级列表、分发器、互斥管理、公平队列、负载均衡
    ├── dist
    ├── excl
    ├── fq
    ├── lb
    └── priolist
protocol架构设计

nanomsg的协议实现遵循以下架构设计:

  • nn_socktype:描述协议的类型和操作 (创建nn_sockbase)

    struct nn_socktype {
        int domain;            // 协议域(通常为AF_SP)
        int protocol;          // 协议ID
        int flags;             // 标志(如NORECV, NOSEND)
        int (*create)(void *hint, struct nn_sockbase **sockbase); // 创建函数
        int (*ispeer)(int socktype);  // 检查对等性
    };
    
  • nn_sockbase:实现具体协议功能(比如req/xreq)

    struct nn_sockbase {
        const struct nn_sockbase_vfptr *vfptr;
        struct nn_sock *sock;
    };
    
  • nn_sockbase_vfptr:定义协议操作的虚函数表(req/xreq的发送函数)

    struct nn_sockbase_vfptr {
        void (*stop) (struct nn_sockbase *self);
        void (*destroy) (struct nn_sockbase *self);
        
        // 管道管理
        int (*add) (struct nn_sockbase *self, struct nn_pipe *pipe);
        void (*rm) (struct nn_sockbase *self, struct nn_pipe *pipe);
        void (*in) (struct nn_sockbase *self, struct nn_pipe *pipe);
        void (*out) (struct nn_sockbase *self, struct nn_pipe *pipe);
        
        // 状态和消息操作
        int (*events) (struct nn_sockbase *self);
        int (*send) (struct nn_sockbase *self, struct nn_msg *msg);
        int (*recv) (struct nn_sockbase *self, struct nn_msg *msg);
        
        // 选项管理
        int (*setopt) (struct nn_sockbase *self, int level, int option, ...);
        int (*getopt) (struct nn_sockbase *self, int level, int option, ...);
    };
    

示例代码
async_demo.c


transports

transports
├── inproc
│   ├── binproc
│   ├── cinproc
│   ├── inproc
│   ├── ins      进程内名称服务实现
│   ├── msgqueue 消息队列实现
│   └── sinproc
├── ipc
│   ├── aipc
│   ├── bipc
│   ├── cipc
│   ├── ipc
│   └── sipc
├── tcp
│   ├── atcp
│   ├── btcp
│   ├── ctcp
│   ├── stcp
│   └── tcp
├── utils  实现传输层共用功能
│   ├── backoff 退避算法
│   ├── base64  base64编码
│   ├── dns     dns解析
│   ├── dns_getaddrinfo_a
│   ├── dns_getaddrinfo
│   ├── iface     网络接口
│   ├── literal   url处理
│   ├── port      端口管理
│   └── streamhdr 流协议头部
└── ws
    ├── aws
    ├── bws
    ├── cws
    ├── sha1  SHA1哈希实现(用于WebSocket握手)
    ├── sws
    ├── ws
    └── ws_handshake  WebSocket握手实现
nn_transport接口设计
struct nn_transport {
    // 传输方式名称
    const char *name;
    
    // 传输ID
    int id;
    
    // 全局初始化与终止函数(可选)
    void (*init) (void);
    void (*term) (void);
    
    // 创建绑定与连接端点的函数
    int (*bind) (struct nn_ep *ep);
    int (*connect) (struct nn_ep *ep);
    
    // 创建传输专用选项集(可选)
    struct nn_optset *(*optset) (void);
};

端点使用传输层的功能:

  1. Socket创建Endpoint时会传入具体的Transport实例
  2. Endpoint保存这个Transport引用
  3. Endpoint调用Transport的bind或connect方法创建具体的传输实例
  4. Transport负责具体的底层通信细节,并通过nn_ep_tran_setup设置回调(主要是跟绑定端点和连接端点有关)
传输方式实现结构

每种传输方式都遵循相似的结构:绑定端点(b)、连接端点©、接受端点(a)、会话(s)和主接口

TCP传输实现示例

以TCP传输为例,TCP传输的实现分为几个关键组件:

  • tcp.c定义了nn_transport接口的实现,包括绑定、连接函数和选项集。
  • btcp(Bound TCP)处理监听端点,负责创建监听套接字,接受新连接,并为每个新连接创建atcp对象。
  • ctcp(Connected TCP)处理连接端点,负责解析地址,创建套接字,连接到远程地址,并处理连接失败的重试逻辑。
  • atcp(Accepted TCP)处理服务器接受的连接,创建和管理数据流。
  • stcp(Stream TCP)处理活动连接的数据传输,实现了实际的发送和接收功能
PUB/SUB状态机转换示例图
PUB
SUB
EP
PIPE
nn_socket()创建成功
nn_bind()/nn_connect()
nn_send()
nn_close()开始
所有EP停止
状态机结束
nn_socket()创建成功
nn_setsockopt()设置订阅
nn_bind()/nn_connect()
nn_recv()
nn_close()开始
所有EP停止
状态机结束
nn_ep_start()
nn_ep_stop()
nn_ep_stopped()
nn_pipebase_start()成功
nn_pipebase_start()失败
nn_pipebase_stop()
创建EP
创建EP
连接建立时创建Pipe
停止所有EP
停止所有EP
NN_SOCK_STATE_INIT
NN_SOCK_STATE_ACTIVE
NN_SOCK_STATE_STOPPING_EPS
NN_SOCK_STATE_STOPPING
NN_SOCK_STATE_TERM
NN_SOCK_STATE_INIT
NN_SOCK_STATE_ACTIVE
NN_SOCK_STATE_STOPPING_EPS
NN_SOCK_STATE_STOPPING
NN_SOCK_STATE_TERM
NN_EP_STATE_IDLE
NN_EP_STATE_ACTIVE
NN_EP_STATE_STOPPING
NN_PIPEBASE_STATE_IDLE
NN_PIPEBASE_STATE_ACTIVE
NN_PIPEBASE_STATE_FAILED
nanomsg 高性能通信库_NanoMsg框架|NanoMsg的简介 NanoMsg简介: NanoMsg是一个Socket的通讯库,使用C语言编写实现的,这样就可以适用于多种操作系统,而且几乎不需要什么依赖,可扩展并且能易于使用。 Nanomsg提供了几种常见的通信模式 ( 也称为“可扩展性协议” ) 是构建分布式系统的基本框架。 通过组合它们,可以创建广 泛的分布式应用程序。 可扩展性协议类型 类型 说明 PAIR 简单的一对一沟通 BUS 简单的多对多通信 REQREP 允许构建无状态集群来处理用户请求 PUBSUB 将消息分发给订阅消息的用 阅读详情

相关推荐

一文入门Nanomsg通信库

详细介绍了Nanomsg通信库,一文便可入门

空名的博客——云深知处 6060

nanomsg框架简介

1、nanomsg概述Ø nanomsg是一个socket library,它提供了几种常见的通信模式,为了能使网络层快速、可扩展并且能易于使用。用C实现,且适用于广泛的操作系统,几乎不需要依赖。这里的通信模式(也称为“可扩展性协议”)是构建分布式系统的基本框架。通过组合它们,可以创建广泛的分布式应用程序。Ø 目前可用的可扩展性协议有: PAIR - 简单的一对一沟通 BUS - 简单的多对多通信 REQREP - 允许构建无状态服务集群来处理用户请求 PUBSUB - 将消息分发给订阅消息的用

木牛的博客 3379

C++高性能微服务架构:高并发设计与异步优化实战指南

微服务架构通过将复杂系统拆分为独立、可独立部署的服务,提升了系统的可维护性和可扩展性。其核心原理在于服务间的松耦合与通信,通常采用RPC或消息队列等技术实现。这种架构的技术价值在于能够支撑高并发、低延迟的业务场景,例如金融交易、实时游戏和物联网平台。在追求极致性能的应用中,对硬件资源的精准掌控和零开销抽象变得至关重要。C++语言凭借其手动内存管理、编译期优化和直接操作系统底层API的能力,成为构建这类高性能微服务的理想选择。本文聚焦于利用现代C++(C++17/20)实现高并发微服务,深入探讨进程间通信(I

weixin_34195142的博客 340

mongos、nanomsg、zeroMQ简述和go-mongos使用实例

mongos、nanomsg、zeroMQ简述和go-mongos使用实例 文章目录mongos、nanomsg、zeroMQ简述和go-mongos使用实例1. mongos、nanomsg简述2. zeroMQ、nanomsg和可扩展协议PAIR(双向通信)REQREP(客户端请求、服务器回复)PIPELINE(单向数据流)BUS(多对多通信)PUBSUB(主题广播)SURVEY(向小组提问)3. mongos及实例 1. mongos、nanomsg简述 来自:https://cloud.tence

逍遥游的博客 2899

nanomsg-browser:浏览器的nanomsg websocket连接

纳米浏览器 该库是标准websocket的便捷包装,可以更轻松地与nanomsg套接字连接。 受支持的和testes是以下客户端协议: 要求 一对 潜艇 公共汽车 表中的内容 安装 通过命令行安装。 npm install nanomsg-browser yarn add nanomsg-browser 注意:此软件包旨在与WebPack,browserify或Rollup等捆绑程序一起使用。 nng相容性 该软件包也应与NNG一起使用。 注意: NNG需要两件事,仅用于发送和接收的ArrayBuffers,如果未指定路径,则至少在使用用于NNG的Rust包装器时,它会发生连接错误。 以下配置应该可以工作:) import { Socket , Protocol } from 'nanomsg-browser' ; const sock = new Socket ( {

LabVIEW Modbus TCP通信避坑指南:解决连接中断、服务器异常与自动重连问题

本文详细解析了LabVIEW环境下Modbus TCP通信的常见问题,包括连接中断、服务器异常等,并提供了自动重连机制的实现方案。通过优化错误处理、超时参数和资源管理,帮助开发者构建更稳定的工业级Modbus TCP客户端,显著提升通信可靠性。

weixin_42525211的博客 424

nanomsg: 简单高效的网络消息通信库

是一个轻量级、高性能的跨平台网络消息通信库,它提供了多种协议,支持点对点通信、发布/订阅模式、请求/应答模式等多种通讯方式。 ## 项目简介 nanomsg 的目标是提供简单易用的接口,用于构建分布式系统中的各种组件之间的通信。它将复杂的网络通信协议进行了抽象和封装,使得开发者只需要关注业务逻辑,而不需要关心底层网络通信细节。 目前,nanomsg 支持以下几种通信模式: - **SP p...

gitblog_00066的博客 2232

LLC混合滞回控制 vs 电压模/电流模:UCC25640x仿真对比与选型指南

在开关电源设计中,LLC谐振变换器的环路补偿是核心难点。传统电压模控制(VMC)和电流模控制(CMC)在LLC拓扑上存在环路增益漂移、动态响应慢等局限。混合滞回控制通过滞回比较器直接调制开关频率,并融合输出电压与谐振腔电流信息,实现了自适应环路增益和快速瞬态响应。该技术显著提升轻载效率与动态性能,适用于高密度适配器、快充及车载充电机等场景。本文基于UCC25640x系列,通过仿真对比三种控制策略,为工程选型与调试提供实践参考。

weixin_33925615的博客 334

Linux 使用nanomsg库进行进程间通信

server:创建一个pair模式的socket,然后将socket设置为非阻塞,将这个套接字加入到nn_poll中进行事假监控,当有事件来时,调用对应的回调函数,进行数据收发。nanomsg是一个消息通信组件,主要通过c语言进行编写的,使用宽松的MIT许可开源,小、轻、快,非常方便。可以使用json数据格式进行,通信,本项目就是使用json进行通信使用cjson库。1、pull/push 单向管道推送模式。3、pair 端对端双向通信模式。4、req/res模型,收发模式。

weixin_45715405的博客 1661

医药行业SAP序列号管理深度解析:如何满足GMP合规要求

本文深度解析了医药行业如何利用SAP序列号管理构建满足GMP合规要求的数字化追溯体系。文章详细阐述了SAP序列号在实现从生产到患者全流程“一物一码”精准追溯中的核心作用,并探讨了其与质量管理、冷链监控等系统的关键集成配置,为医药企业应对严格监管、保障产品质量与安全提供了切实可行的技术方案。

backprop5master的博客 655

华为OD机试真题 新系统【进制转换后自定义排序】

华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。

qq_45776114的博客 594

轻量级高性能通信利器:nanomsg 详解与实战

nanomsg 的核心价值的在于“轻量”与“高效”的平衡——它既不像原生 Socket 那样需要手动处理底层细节,也不像重型消息队列那样占用大量资源,适合对性能和资源占用都有严格要求的场景。

编程改变世界。想做一些改变世界的产品。感谢一键三连。 2798

17track单号查询逆向分析

这就说明该网站很有可能存在其它检测点,而检测本地替换最大可能的就是检测了代码格式化或者代码长度。也一样,要么导致网站卡死,要么会导致网页加载异常,这里可能就难到不少人了,让我们一步一步解决。而这个站主要是检测了代码格式化,无限循环检测造成了网站卡死,经多次测试发现检测点共三处。方法中代码很长,但是经调试后发现,它其实只返回一个固定的值,这里直接写死即可。同样的,虽然看起来很长,但是跟过之后就会发现流程很简单,这里主要就是对。追加了一些值,是一条很长的语句,整理代码。,核心流程也很简单,稍微跟一下就出来了,

pyzzd的博客 1622

zeroMQ和nanoMSG的对比

zeromq是作者用cpp早期创作,作者承认存在一些明显问题;nanomsg则是用C写的,更为成熟。

haozizang的博客 1493

【Windows Server 2019】活动目录 (Active Directory) ——将计算机加入域和脱离域

博文介绍了如何将计算机加入AD域和脱离AD域,包括加入域,验证客户机加入到域后的信息,使用域账户用户在客户机上登录,使用本地账户用户在计算机上登录,脱离域。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6169

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

nanomsg使用

nanomsg是一个消息通信组件 - zeromq的作者之一用C语言重写的通信框架, 使用宽松的MIT许可开源,小、轻、快,非常方便,介绍我就不多写了,下面我具体的讲用法,用了你就知道是怎么回事。 pull/push 单向管道推送模式 push/pull套接字结合使用可实现消息队列的扇出模式, 这是一个1对多的模式,服务端不能有多个,但客户端可以多个。 官网上给的这个图是1对1的,...

章志强的专栏 2万+

YOLOv8的特征蒸馏代码应用讲解(CWD/MGD/mimic/在线蒸馏/逻辑蒸馏)

基于YOLOv8的逻辑蒸馏、特征蒸馏、在线蒸馏等方法代码介绍。

qq_41920323的博客 2582

NanoMsg框架|NanoMsg的简介

学更好的别人,做更好的自己。——《微卡智享》本文长度为1254字,预计阅读4分钟写在最前最近由于新冠状肺炎病毒的影响,过年期间一直呆在家里,除了基本购买生活必须品外,可以说是足不出户了,...

Vaccae的博客 1752

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Nanomsg:高性能的消息传递库在嵌入式开发中跨进程、跨设备、分布式系统的应用

在嵌入式开发中,可靠的消息传递和通信机制是至关重要的。随着嵌入式系统变得越来越复杂,高效的通信协议和库变得尤为重要。Nanomsg 是一个高性能的消息传递库,它为开发者提供了简单而强大的工具来实现分布式系统中的通信。在这篇博客中,我们将探讨 Nanomsg 在嵌入式开发中的应用。

科技改变人类,技术成就未来 1658

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

nng 概述

NNG/nanomsg 是最近项目上使用到的一个通信库,用来实现进程间过程调用和线程间通信,很是方便。NNG 是 nanomsg 的继任版本,而 nanomsg 则是流行的 ZMQ (一个简单好用的传输层,像框架一样的一个 socket library)的 C 重写版。NNG 将通信使用的协议和传输分离,同一个协议可以工作在不同的传输层上,类似与 TCP/IP 的应用层和传输层的分层,同时接口上屏蔽了底层细节,统一用字符串 URL 来描述传输模式。这样当使用场景修改时,可以通过简单修改 URL 来实现适应,

木牛的博客 5209

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Nanomsg使用说明 Pipeline (A One-Way Pipe)

最近在看一个项目,里面有很多第三方库,里面有一个就是Nanomsg。不知道为什么我对这个库的名字和他的主页特别有感觉 嘿嘿!介于这个项目是我今年主力要看完并且改造的项目,所以我决定把他的第三方库都学习一下,之后还会有rxcpp这个特别刺激。。。。。。 这个系列主要是讲使用,具体原理,不考究。原理牵涉到很多很多很多别的东西。 回归主题 Nanomsg 这是一个可以跨进程(当然也可以单进程)的通信库,...

Tyrant的博客 3691

关于 nng/nanomsg 库的一点想法

NNG/nanomsg 是最近项目上使用到的一个通信库,用来实现进程间过程调用和线程间通信,很是方便。NNG 是 nanomsg 的继任版本,而 nanomsg 则是流行的 ZMQ 的 C 重写版。NNG 将通信使用的协议和传输分离,同一个协议可以工作在不同的传输层上,类似与 TCP/IP 的应用层和传输层的分层,同时接口上屏蔽了底层细节,统一用字符串 URL 来描述传输模式。这样当使用场景修改时,可以通过简单修改 URL 来实现适应,极具灵活性。同时如 NNG 描述所言 “light-weight bro

木牛的博客 3523

为什么ZeroMQ不应该成为你的第一选择

为什么ZeroMQ不应该成为你的第一选择

圈儿的专栏 7848

nanomsg项目实战

文章目录nanomsg下载编译使用方式基本概念PipelineRequest/ReplyPairPub/SubSurveyBus项目中使用发布服务订阅服务makefile nanomsg下载 下载地址:https://github.com/nanomsg/nanomsg/releases 编译 unzip nanomsg-1.1.5.zip cd nanomsg-1.1.5/ mkdir build cd build cmake .. cmake --build . ctest . sudo cmake

deroy 2963

nanomsg高性能分布式通信库实战

需要高性能、低延迟通信的分布式系统微服务架构中的服务间通信实时数据处理和流处理需要多种通信模式的复杂系统嵌入式设备和IoT应用nanomsg结合了简单易用的API和灵活多变的通信模式,是构建现代分布式系统的理想选择。其轻量级特性和高性能使其在众多通信库中脱颖而出。关注嵌入式软件客栈公众号,获取更多内容。

Psyduck_ing的博客 1276
上一篇: termux app遇到签名问题的解决方法
捞杰
博客等级 码龄6年 47粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值