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

一、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仓库网址
下载如下版本:
高性能通信库——nanomsg(含交叉编译)_第1张图片
复制到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

高性能通信库——nanomsg(含交叉编译)_第2张图片

调用本地的构建系统执行 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

高性能通信库——nanomsg(含交叉编译)_第3张图片

三、编译与安装(arm)

Linux主机:ubuntu-18.04

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

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

开发板:100ASK_STM32MP157_PRO开发板

在nanomsg根目录下的CMakeLists.txt文件里加上交叉编译器设置:
高性能通信库——nanomsg(含交叉编译)_第4张图片

然后后输入如下命令:

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

高性能通信库——nanomsg(含交叉编译)_第5张图片

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

四、测试与使用

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
#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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
#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(含交叉编译)_第6张图片

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

参考博文:

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

你可能感兴趣的:(网络,java,服务器)