高性能通信库——nanomsg(含交叉编译)

news2024/11/28 5:50:24

一、nanomsg介绍

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

  • 使用nanomsg可以实现线程间通信,nanomsg库又很轻量级,对于嵌入式程序编程真的非常好用。使用nanomsg库实现多线程之间的通信(一)

可扩展性协议类型

  • PAIR (配对模式):简单的一对一沟通
  • BUS (总线模式):简单的多对多通信
  • REQREP (请求/回复模式):允许构建无状态集群来处理用户请求
  • PUBSUB (扇入模式):将消息分发给订阅消息的用户
  • PIPELINE (扇出模式):汇总来自多个来源的消息,并在许多目的点之间进行负载平衡
  • SURVEY (调查模式):允许一次查询多个应用程序的状态

可扩展协议是在网络通信协议之上实现的,当前版本nanomsg支持一下网络协议:

  • INPROC:单进程内通信;

  • IPC:单机内多进程的通信;

  • TCP:通过tcp协议的网络通信;

参考博文:C++网络库探索(二)

二、编译与安装(x86)

下载地址:nanomsg的github仓库网址
下载如下版本:
在这里插入图片描述
复制到Ubuntu中,压缩

tar zxvf nanomsg-1.1.4.tar.gz

进入文件目录

cd nanomsg-1.1.4

创建编译目录build,并移动到build目录

mkdir build && cd build

创建x86_lib文件夹

mkdir x86_lib

根据CMakeLists.txt文件,生成Makefile

cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/x86_lib

编译

cmake --build .

测试驱动程序

ctest .

ctest可执行文件是CMake测试驱动程序

  • 使用enable_testing()和add_test()命令的项目创建的cmake生成构建树具有测试支持。此程序将运行测试并报告结果。
  • ctest 使用教程:cmake:命令行工具ctest

在这里插入图片描述

调用本地的构建系统执行 install 这个目标,将生成的库和头文件安装到系统上,其实就是把静态库和动态库以及头文件拷贝到系统库文件目录下,如果前面指定安装位置为build/x86_lib,至此,就可以和使用其他系统库一样,使用nanomsg库了

sudo cmake --build . --target install

为了让这些由某个工程后生成的动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。(直接sudo ldconfig即可)。linux下面的sudo ldconfig命令

sudo ldconfig

进入build/x86_lib/lib目录。查看是否有libnanomsg.so相关文件,查看生成的动态库是否是x86架构的:

readelf -h libnanomsg.so

在这里插入图片描述

三、编译与安装(arm)

Linux主机:ubuntu-18.04

交叉编译器:arm-buildroot-linux-gnueabihf

开发板kernel:Linux 5.4.0-150-generic x86_64

开发板:100ASK_STM32MP157_PRO开发板

在nanomsg根目录下的CMakeLists.txt文件里加上交叉编译器设置:
在这里插入图片描述

然后后输入如下命令:

mkdir build && cd build
mkdir arm_lib
cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/arm_lib
cmake --build .
sudo cmake --build . --target install
sudo ldconfig

进入build/arm_lib/lib目录。查看是否有libnanomsg.so相关文件,查看生成的动态库是否是arm架构的:

readelf -h libnanomsg.so

在这里插入图片描述

通过编译得到的是动态库,如果需要编译为静态库调用。只要修改一下CMakeLists.txt中编译规则

四、测试与使用

演示进程间通信的例子
nanomsg_server.c:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <nanomsg/pair.h>
#include <nanomsg/bus.h>
#include <nanomsg/nn.h>
 
#define BUF_LEN  100
 
char *url = "tcp://127.0.0.1:2021";
 
int main(void)
{
 int server_sock = 0;
 char buf[BUF_LEN] = {0};
 
 if (server_sock = nn_socket (AF_SP, NN_PAIR) < 0)
 {
  printf("create server socket failed!\n");
  return -1;
 }
 
 if (nn_bind(server_sock, url) < 0) 
 {
  printf("bind server sock failed!\r\n");
  nn_close(server_sock);
  return -1;
 }
 printf("server init success!\n");
 
 while (1)
 {
  if (nn_recv(server_sock, buf, sizeof(buf), 0) < 0) 
  {
   printf("recv failed!\n");
   nn_close(server_sock);
   exit(EXIT_FAILURE);
  }
  else
  {
   printf("recieve client msg: %s\r\n", buf);
   if (nn_send(server_sock, buf, sizeof(buf), 0) < 0)
   {
    printf("send failed!\r\n");
    nn_close(server_sock);
    exit(EXIT_FAILURE);
   }
  }
 }
 
 nn_close(server_sock);
 
 return 0;
}

nanomsg_client.c:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <nanomsg/pair.h>
#include <nanomsg/bus.h>
#include <nanomsg/nn.h>
 
#define BUF_LEN  100
 
char *url = "tcp://127.0.0.1:2021";
 
int main(void)
{
 int client_sock = 0;
 char buf[BUF_LEN] = {0};
 
 if (client_sock = nn_socket (AF_SP, NN_PAIR) < 0)
 {
  printf("create server socket failed!\n");
  return -1;
 }
 
 if (nn_connect(client_sock, url) < 0) 
 {
  printf("connect server sock failed!\r\n");
  nn_close(client_sock);
  return -1;
 }
 
 printf("client init success!\n");
 
 while (1)
 {
        scanf("%s", buf);
  if (nn_send(client_sock, buf, sizeof(buf), 0) < 0)
  {
   printf("send failed!\r\n");
   nn_close(client_sock);
  }
 
        memset(buf, 0, BUF_LEN);   
 
  if (nn_recv(client_sock, buf, sizeof(buf), 0) > 0) 
  {
   printf("recieve server msg: %s\r\n", buf);
  }
        memset(buf, 0, BUF_LEN);   
 }
 
 nn_close(client_sock);
 
 return 0;
}

编译:

gcc nanomsg_server.c -o nanomsg_server -I /home/book/Desktop/nanomsg/nanomsg-1.1.4/build/x86_lib/include -L /home/book/Desktop/nanomsg/nanomsg-1.1.4/build/x86_lib/lib -lnanomsg
gcc nanomsg_client.c -o nanomsg_client -I /home/book/Desktop/nanomsg/nanomsg-1.1.4/build/x86_lib/include -L /home/book/Desktop/nanomsg/nanomsg-1.1.4/build/x86_lib/lib -lnanomsg

修改环境变量(临时):

export LD_LIBRARY_PATH=/home/book/Desktop/nanomsg/nanomsg-1.1.4/build/x86_lib/lib:$LD_LIBRARY_PATH

运行:

在这里插入图片描述

嵌入式大杂烩 | 一个高性能通信库的简单使用分享

参考博文:

nanomsg关于多线程与多进程间通信的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 小技巧之 InkWell Ink 你了解多少

今天要介绍一个「陈年」小技巧&#xff0c;主要是关于 InkWell 的基础科普&#xff0c;InkWell 控件相信大家不会陌生&#xff0c; 作为 Flutter 开发中最常用的点击 Widget &#xff0c;配合 Flutter 自带的 Material &#xff0c;可以轻松实现带有水波纹等的点击效果。 而之所…

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器&#xff1a;配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址&#xff1a;官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…

如何使用 PowerPoint 2021 制作演示文稿?

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 引言 PowerPoint 是一款非常常用的演示文稿制作工具&#xff0c;它可以帮助您创建漂亮的幻灯片&#xff0c;展示您的想法和信息。如果您是 PowerPoint 的新手&#xff…

xx客滑块

xx客滑块 网址流程1、访问首页&#xff0c;得到网页源代码得到 sessionId2、生成dInfo参数&#xff08;getInfoTp接口使用到&#xff09;&#xff0c;是AES 加密&#xff08;不校验&#xff09;3、访问 /captcha/getInfoTp 得到responseId &#xff08;可以认为是图片id&#x…

上海细化“元宇宙”概念 落地场景仍待破局

日前&#xff0c;一份关于“元宇宙”更加具体的行动方案引发业内高度关注&#xff1a;上海发布《上海市“元宇宙”关键技术攻关行动方案&#xff08;2023—2025年&#xff09;》的通知。 这说明政府层面开始进一步细化&#xff0c;以更好推动‘元宇宙’产业的发展。” 主攻沉…

【强烈推荐】基于STM32的TFT-LCD各种显示实现(内容详尽含代码)

前言&#xff1a;TFT-LCD模块作为人们日常生活中常见屏幕类型之一&#xff0c;使用的受众面非常广阔。例如&#xff1a;显示各个传感器数值&#xff0c;显示精美界面&#xff0c;多级化菜单系统等等都不离不开他的身影。可以说学会TFT-LCD模块是嵌入式开发必须掌握的驱动开发技…

AOP切面记录日志

AOP切面记录日志 一、导包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>二、写一个注解 /*** 用于切面记录日志用的注解&#xff0c;只能加在方法中使用* a…

让性能腾飞!亚马逊云科技的 Java 云端之旅

在上篇文章中&#xff0c;我们为大家介绍了亚马逊的 Java 生态及丰富的开发工具、框架。本文将分享亚马逊的 Java 架构、迁移途径&#xff0c;并分享一个具体实例&#xff0c;介绍如何使用机器学习来构建 Java 应用和提升 Java 性能。 亚马逊云科技开发者社区为开发者们提供全…

vulhub-structs2-S2-009 远程代码执行漏洞复现

漏洞描述 影响版本: 2.1.0 - 2.3.1.1 漏洞原理 Struts2对s2-003的修复方法是禁止#号&#xff0c;于是s2-005通过使用编码\u0023或\43来绕过&#xff1b;于是Struts2对s2-005的修复方法是禁止\等特殊符号&#xff0c;使用户不能提交反斜线。 但是&#xff0c;如果当前action…

Java---第三章(选择,循环,二重循环语句,输入,调试,标签)

Java---第三章 一 流程图二 选择结构简单的if-else嵌套的if-else多重if的选择语句&#xff08;else-if&#xff09;switch语句 二 输入验证三 程序调试四 循环结构while循环do-while循环for循环流程控制二重循环&#xff08;重点&#xff09; 五 标签 label&#xff08;标号&am…

代码随想录二刷day27 | 回溯之 39. 组合总和 40.组合总和II 131.分割回文串

day27 39. 组合总和回溯三部曲剪枝优化 40.组合总和II回溯三部曲 131.分割回文串回溯三部曲判断回文子串 39. 组合总和 题目链接 解题思路&#xff1a; 本题没有数量要求&#xff0c;可以无限重复&#xff0c;但是有总和的限制&#xff0c;所以间接的也是有个数的限制。 本题搜…

AI对话分析,如何赋能销售人员实现销售增长和提升客户满意度?

在当今的商业世界中&#xff0c;销售人员的工作关键在于建立与潜在客户的关系&#xff0c;了解他们的需求&#xff0c;并提供满足这些需求的产品或服务。虽然这听起来简单&#xff0c;但实际上&#xff0c;这需要许多复杂的技能和经验。幸运的是&#xff0c;有许多工具和技术可…

消息队列及常见消息队列介绍

一、消息队列(MQ)概述 消息队列&#xff08;Message Queue&#xff09;&#xff0c;是分布式系统中重要的组件&#xff0c;其通用的使用场景可以简单地描述为&#xff1a; 当不需要立即获得结果&#xff0c;但是并发量又需要进行控制的时候&#xff0c;差不多就是需要使用消息队…

金属元素螯合剂:1189194-64-6,DOTA-(COOt-Bu)3-CH2-Alkynyl,试剂的结构式和CAS分享

文章关键词&#xff1a;双功能螯合剂&#xff0c;大环配体一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; 西安凯新生物科技有限公司供应的​DOTA-(COOt-Bu)3-CH2-Alkynyl中&#xff0c;​DOTA分子是一种十二元四氮杂大环配…

【每日算法】【205. 同构字符串】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

随机2D形状周围层流预测!基于飞桨实现图形神经网络

项目背景 近年来&#xff0c;快速流场预测领域一直由基于像素的卷积神经网络&#xff08;Convolution Neural Network&#xff0c;CNN&#xff09;主导。当 CFD 与基于 CNN 的神经网络模型耦合时&#xff0c;来自网格的数据必须在笛卡尔网格上进行插值&#xff0c;然后再投影回…

Jetpack Compose Material3 组件之 DatePicker(日期选择)

前言 在之前我使用 Comose 写 APP 的时候&#xff0c;官方还没有给出关于 DatePicker 的解决方案。 当时为了在 Compose 中实现 DatePicker &#xff0c;大致有两种方案&#xff1a; 一是使用原生 VIew 的 DatePicker&#xff0c;但是因为觉得我即然都用 Compose 了&#xf…

图书推荐|Python数据分析与挖掘实战(第2版)

Python数据分析与挖掘实战&#xff08;第2版&#xff09;一共分为三个部分&#xff0c;包括基础篇&#xff08;第1&#xff5e;5章&#xff09;、实战篇&#xff08;第6&#xff5e;12章&#xff09;、提高篇&#xff08;第13章&#xff09;。其中基础篇介绍了数据挖掘的基本原…

揭秘猫狗的微生物世界:肠道微生物群的意义和影响

谷禾健康 “铲屎官”们都希望自己的宠物有一个健康的身体。但是猫狗都不会说话&#xff0c;平时我们只能从它们的精神状态来判断它们是否健康&#xff0c;但这并不准确。去宠物医院又不太方便&#xff0c;很多猫咪和狗狗还会对抽血等检查有所抗拒。 肠道微生物检测在人类中的应…

边云协同:大小模型如何协同推理?

1 背景 “化繁为简、大巧不工”是机器学习的初衷之一。 费米曾讲述一个故事&#xff0c;冯诺依曼告诉他&#xff0c;用四个参数就可以拟合出一头大象&#xff0c;用五个参数就可以让大象鼻子动起来&#xff0c;这就是“四个参数画大象”的故事。 但AI模型规模不断剧增已是不…