1. mongos、nanomsg简述

来自:Go的nanomsg实现 mangos - 云+社区 - 腾讯云

nanomsg是一个消息协议SP ("Scalable Protocols"可扩展协议)的c语言实现,而mangos用golang实现了SP (“Scalable Protocols”)。

消息协议不同于通常我们说的消息队列,是指一个简单的传输会话协议。

mangos重点也是替代直接手写TCP,实现各种场合的通讯范式。

推荐:Fast, Scalable Networking in Go with Mangos – Brave New Geek

那么mangos、nanomsg有何优点么?

主要是:简单、抽象合理、兼容多种语言、轻量级、学习成本低、比自己造的轮子好用很多。

理解的误区:mangos/nanomsg并不是消息队列,也不是RPC框架。

2. zeroMQ、nanomsg和可扩展协议

A Look at Nanomsg and Scalability Protocols (Why ZeroMQ Shouldn’t Be Your First Choice) – Brave New Geek

可以简单理解这些网络框架和协议是对TCP、PGM、IPC、ITC等协议的封装,提供新的接口便于分布式环境下的通信,而zeroMQ较差的可扩展性将其局限于某一些协议,为了解决扩展性等一些其它的问题出现了Nanomsg,Nanomsg 通过为传输和消息传递协议提供可插入的接口来解决这个问题。这意味着支持超出标准集 PUB/SUB、REQ/REP 等的新传输(例如 WebSockets)和新消息模式。

也许最有趣的是 nanomsg 与 ZeroMQ 的哲学背离。nanomsg 不是作为一个通用的网络库,而是打算通过实现所谓的“可扩展性协议”来提供用于构建可扩展和高性能分布式系统的“乐高积木”。这些可扩展协议是通信模式,它们是网络堆栈传输层之上的抽象。这些协议彼此完全分离,因此每个协议都可以体现明确定义的分布式算法。正如 nanomsg 的作者 Martin Sustrik 所说,其目的是通过IETF标准化协议规范。(zeroMQ可以理解成网络库,而NanoMsg更像按照应用场景定义新的可扩展协议,具体选择那一种则需要看应用场景,就分布式场景下NanoMsg的可扩展性可能更适合分布式复杂多变场景)

Nanomsg 目前定义了六种不同的可扩展性协议:PAIR、REQREP、PIPELINE、BUS、PUBSUB 和 SURVEY。

PAIR(双向通信)

PAIR 在两个端点之间实现简单的一对一、双向通信。两个节点可以相互发送消息。

REQREP(客户端请求、服务器回复)

REQREP 协议定义了一种用于构建无状态服务来处理用户请求的模式。客户端发送请求,服务器接收请求,进行一些处理,然后返回响应。

PIPELINE(单向数据流)

PIPELINE 提供单向数据流,这对于创建负载平衡的处理管道非常有用。生产者节点提交分布在消费者节点之间的工作。

BUS(多对多通信)

BUS 允许从每个对等点发送的消息传递到组中的每个其他对等点。

PUBSUB(主题广播)

PUBSUB 允许发布者向零个或多个订阅者多播消息。订阅者可以连接到多个发布者,可以订阅特定的主题,允许他们只接收与他们相关的消息。

SURVEY(向小组提问)

最后一个可扩展性协议是 SURVEY。SURVEY 模式与 PUBSUB 的相似之处在于来自一个节点的消息被广播到整个组,但不同的是组中的每个节点都 响应该消息。这开辟了各种各样的应用程序,因为它使您可以快速轻松地一次性查询大量系统的状态。调查受访者必须在调查员配置的时间窗口内做出回应。

3.C++的相关函数

NanoMsg相关函数

微卡智享

下面我们就列一下几个常用的函数,基本的通讯也就是用这几个函数进行处理的。

函数 简单介绍
nn_socket 创建一个套接字
nn_setsockopt 设置套接字的选项
nn_bind 绑定地址
nn_connect 连接另一个套接字
nn_send 发送数据
nn_recv 接收数据

nn_socket

所在头文件:#include <nanomsg/nn.h>,作用为创建一个套接字。

int nn_socket (int domain, int protocol);

参数:

domain:这个参数有两个格式,AF_SP和AF_SP_RAW,AF_SP表示标准的格式,AF_SP_RAW表示一种原始的格式,一般开发使用AF_SP即可。

protocol:设置通讯协议类型。如NN_PAIR等。

返回值:返回套接字。

nn_setsockopt

所在头文件:#include <nanomsg/nn.h> ,作用和原始socket开发中的setsockopt类似,用来设置套接字的选项。

int nn_setsockopt (int s, int level, int option, const void *optval, size_t optvallen);

参数:

s:上面的函数nn_socket的返回值;

level:默认正常0即可(即NN_SOL_SOCKET);

option:需要改变的选项,一般我们来说主要就是设置超时这块的设置(即NN_SNDTIMEO和NN_RCVTIMEO);

*optval:上一个option参数对应的值;

optvallen:上一个*optval参数的长度;

返回值:返回不为零表示失败。

nn_bind

所在头文件:#include <nanomsg/nn.h> ,作用绑定地址。

int nn_bind (int s, const char *addr);

参数:

s:上面的函数nn_socket的返回值;

*addr:地址;

返回值:返回小于零表示失败。

nn_connect

所在头文件:#include <nanomsg/nn.h> ,作用连接另一个套接字。

int nn_connect(int s, const char *addr);

参数:

s:上面的函数nn_socket的返回值;

*addr:连接的地址;

返回值:返回小于零表示失败。

nn_send

所在头文件:#include <nanomsg/nn.h> ,作用发送数据。

int nn_send (int s, const void *buf, size_t len, int flags);

参数:

s:上面的函数nn_socket的返回值;

*buf:发送的数据;

len:发送数据的长度;

flags:0表示在阻塞模式下执行,1(NN_DONTWAIT),表示在非阻塞模式下执行。

返回值:返回发送数据的长度,小于零表示错误。

nn_recv

所在头文件:#include <nanomsg/nn.h> ,作用接收数据。

int nn_recv(int s,void * buf,size_t len,int flags);

参数:

s:上面的函数nn_socket的返回值;

*buf:接收的数据;

len:接收数据的最大长度;

flags:0表示在阻塞模式下执行,1(NN_DONTWAIT),表示在非阻塞模式下执行。

返回值:返回接收到的数据长度。

实例 nnclient.cpp

/** @Copyright <YEAR> <COPYRIGHT HOLDER>: * @Author: lis* @Date: 2022-04-28 00:35:35* @LastEditTime: 2022-04-28 00:48:00* @LastEditors: lis* @Description: nanomsg clinet 的测试* @FilePath: /nanomsg/src/nnclient.cpp*/
#include <stdio.h>
#include <string>
#include <iostream>
#include "nanomsg/reqrep.h"
#include "nanomsg/nn.h"
​
​
int main(int argc, char* argv[]) {int m_sock_ctl;if ((m_sock_ctl = nn_socket(AF_SP, NN_REQ)) < 0) {printf("=======control sock error: nn_socket\n");m_sock_ctl = 0;return -1;}if (nn_connect(m_sock_ctl, "tcp://0.0.0.0:10000") < 0) {printf("=======control sock error: nn_connect\n");nn_close(m_sock_ctl);m_sock_ctl = 0;return -2;}
​std::string cmd = "Open 192.168.1.44";nn_send(m_sock_ctl, cmd.c_str(), cmd.length(), 0);char* buffer = NULL;int buffer_len = 0;if ((buffer_len = nn_recv(m_sock_ctl, &buffer, NN_MSG, 0)) <= 0) {printf("=======control sock error: nn_recv\n");return -1;}std::string msg = std::string(buffer, buffer_len);printf("%s\n", msg.c_str());nn_freemsg(buffer);return 0;
}
​
​
​

server.cpp

/** @Copyright <YEAR> <COPYRIGHT HOLDER>: * @Author: lis* @Date: 2022-04-28 00:00:37* @LastEditTime: 2022-04-28 00:45:24* @LastEditors: lis* @Description: nanomsg server 的测试* @FilePath: /nanomsg/src/server.cpp*/
#include <stdio.h>
#include <string>
#include <iostream>
#include "nanomsg/reqrep.h"
#include "nanomsg/nn.h"
​
#define CTL_URL "tcp://0.0.0.0:10000"
​
int main(int argc, char* argv[]) {int m_sock_ctl;if ((m_sock_ctl = nn_socket(AF_SP, NN_REP)) < 0) {printf("=======control sock error: nn_socket\n");return -1;}if (nn_bind(m_sock_ctl, CTL_URL) < 0) {printf("=======control sock error: nn_bind\n");nn_close(m_sock_ctl);m_sock_ctl = 0;return -2;}
​printf("=======control sock OK: %s\n", CTL_URL);
​// int timeout = 1000;// if (nn_setsockopt(m_sock_ctl,//                 NN_SOL_SOCKET,//                 NN_SNDTIMEO,//                 &timeout,//                 sizeof(int)) < 0) {//     printf("=======channel sock error: nn_setsockopt\n");//     nn_close(m_sock_ctl);//     return -1;// }// if (nn_setsockopt(m_sock_ctl,//                 NN_SOL_SOCKET,//                 NN_RCVTIMEO,//                 &timeout,//                 sizeof(int)) < 0) {//     printf("=======channel sock error: nn_setsockopt\n");//     nn_close(m_sock_ctl);//     return -1;// }
​
​while (1) {char* buffer = NULL;int buffer_len = 0;// 获取请求if ((buffer_len = nn_recv(m_sock_ctl, &buffer, NN_MSG, 0)) <= 0) {printf("=======control sock error: nn_recv\n");return -1;}std::string msg = std::string(buffer, buffer_len);nn_freemsg(buffer);
​printf("=========recv msg: %s\n", msg.c_str());std::string result = "test";
​printf("=========send msg: %s\n", result.c_str());// 返回相应nn_send(m_sock_ctl, result.c_str(), result.length(), 0);}
​nn_close(m_sock_ctl);
​
​
}

NanoMsg框架C++的相关函数介绍相关推荐

  1. NanoMsg框架|Android Studio编译NanoMsg源码

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2184字,预计阅读6分钟 导语 前面的章节已经把NanoMsg的简介,及C#相关的NNanoMsg使用Demo已经介绍完成了, ...

  2. Ext2.0框架的Grid使用介绍(转)

     Ext2.0框架的Grid使用介绍 最近空闲时间在学习Ext2.0框架,只有一个字的感叹"强",我从未想到JS代码能够写出这么绚丽的Web页面出来,以前看到YUI,惊若天人,如今 ...

  3. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  4. 直播 | 清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍

    「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...

  5. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

  6. 分布式事物框架Easy-Transaction--使用入门介绍

    分布式事物框架Easy-Transaction--使用入门介绍 The origin This framework is inspired by a PPT (<大规模SOA系统的分布式事务处理 ...

  7. 分布式事物框架--EasyTransaction的入门介绍

    分布式事物框架--EasyTransaction的入门介绍 柔性事务,分布式事务,TCC,SAGA,可靠消息,最大努力交付消息,事务消息,补偿,全局事务,soft transaction, distr ...

  8. 六.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---4.laserMapping.cpp--后端建图和帧位姿精估计(优化)

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  9. 五.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---3.laserOdometry.cpp--前端雷达里程计和位姿粗估计

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  10. 四.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---2.scanRegistration.cpp--前端雷达处理和特征提取

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

最新文章

  1. 中文Python:中文编程不是梦
  2. STM32之NVIC的深入详解
  3. 用J-Link烧写u-boot到Nor Flash—— 韦东山嵌入式Linux视频学习笔记04
  4. FlowDroid工具的构建与运行
  5. java调用C++ DLL库方法
  6. 管道的概念(匿名管道)
  7. kibana客户端工具操作ElasticSearch(增删改查二)
  8. java collection源码_jdk源码阅读Collection实例分析
  9. Excel计数(count)可视化
  10. android论文引用图片,Android自动解析html带图片,实现图文混排
  11. java pdf在线阅读插件_JAVA实现在线查看PDF和office文档
  12. Web—09-正则表达式
  13. 【cf-edu-round72: C 】The Number Of Good Substrings(思维)
  14. 一种简单的不净观(女人)方法,帮助看破色欲
  15. Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
  16. 计算机不能正常开机怎么处理,电脑不能正常启动的原因和处理步骤
  17. React中实现防抖功能的两种方式
  18. 微信小程序那点事儿(必看踩坑实用解决BUG)------持续更新(2)
  19. MySQL8.0安装教程,在Linux环境安装MySQL8.0教程,最新教程 超详细
  20. 夜幕团队成员的工资究竟几 K ?

热门文章

  1. 计算机怎么禁用软件网络访问,Windows10系统下禁止软件联网的两种方法
  2. 伺服电机常用参数设置_松下伺服电机一般都设置哪些参数
  3. 08cms中error_08cms_licens 故障
  4. 两个好用的eclipse js编辑器插件
  5. 【开源电机驱动】H桥的安全保护机制
  6. 隐马尔可夫模型(HMM)推导详解
  7. 【汇智学堂】-JS菜鸟版手机小游戏(五子棋游戏之一---准确落下棋子)
  8. 一款免费好用的英文润色软件(1Checker没错,这是免费的)
  9. IOS 关于扬声器和听话筒的设置 ----自己试验过的,可以达到扩音器和听筒播放的效果...
  10. ubuntu freeradius mysql_ubuntu上安装和配置FreeRadius