0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nanomsg的基本使用

FPGA之家 来源:Linux大陆 作者:Linux大陆 2022-07-04 10:39 次阅读

前言

上次的推文实用 | 分享几个非常实用的开源项目中有提到过nanomsg,正好最近的工作中也有用到nanomsg,本篇推文来简单分享一下nanomsg的基本使用。

nanomsg简介

nanomsg是一个实现了几种可扩展协议的高性能通信库;可扩展协议的任务是定义多个应用系统如何通信,从而组成一个大的分布式系统。

下载链接:

https://github.com/gaobaoru/nanomsg/

当前版本nanomsg支持以下协议:

配对模式:简单的一对一的通信;

总线模式:简单的多对多的通信;

请求/回复模式:支持组建大规模的集群服务来处理用户请求;

扇入模式:支持从多个源聚合请求消息;

扇出模式:支持分配到多个节点以支持负载均衡;

调查模式:允许在一个单一的请求里检查多个应用的状态;

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

INPROC:单进程内通信;

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

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

nanomsg用c实现,不依赖系统特性,所以支持多个操作系统

nanomsg编译/交叉编译

按照上面的链接下载后的到:

73bf60e4-e3a1-11ec-ba43-dac502259ad0.png

首先创建一个build文件夹用于管理我们编译所需、编译生成的一些文件。

这里,我们演示编译/交叉编译,首先在build目录下分别创建如下两个文件夹存放我们待会编译得到的x86_lib、arm_lib:

73eaf808-e3a1-11ec-ba43-dac502259ad0.png

然后在build路径下根据自己的需要输入如下命令生成Makefile、进行编译/交叉编译、测试:

1、编译

①cmake..-DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_x86_lib
②cmake--build.
③ctest.
④sudocmake--build.--targetinstall
⑤sudoldconfig

① :/usr/local/ 是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个目录,这里我们指定到当前目录的nanomsg_x86_lib目录。

7410e874-e3a1-11ec-ba43-dac502259ad0.png

② :编译。

74437f14-e3a1-11ec-ba43-dac502259ad0.png

③ :测试。CMake 提供了一个称为 CTest 的测试工具,nanomsg项目根目录的 CMakeLists 文件中调用了 add_test 命令进行测试。

7480142e-e3a1-11ec-ba43-dac502259ad0.png

④ :安装。把编译生成的库及相关头文件安装到nanomsg_x86_lib目录中。

74d90d68-e3a1-11ec-ba43-dac502259ad0.png

7533fb60-e3a1-11ec-ba43-dac502259ad0.png

⑤ :让生成的nanomsg动态链接库为系统所共享。ldconfig是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。

查看生成的动态库是否是x86架构的:

7554b1fc-e3a1-11ec-ba43-dac502259ad0.png

2、交叉编译

在nanomsg根目录下的CMakeLists.txt文件里加上交叉编译器设置:

757ff60a-e3a1-11ec-ba43-dac502259ad0.png

然后输入如下命令:

①cmake..-DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_arm_lib
②cmake--build.
③sudocmake--build.--targetinstall
④sudoldconfig

与上面的编译x86的nanomsg 库的步骤差不多,这里把测试的指令ctest .去掉了,因为生成的可执行文件是arm架构的,所以直接运行测试会出错。

查看生成的动态库是否是arm架构的:

75dd3c0c-e3a1-11ec-ba43-dac502259ad0.png

nanomsg使用例子

nanomsg可用于多线程、多进程、多机通信。nanomsg是一个socket library,所以其应用接口与标准的socket接口差不多,只是多了前缀nn_,如nn_socket、nn_close、nn_send、nn_recv等。关于socket可查阅往期笔记:

【socket笔记】TCP、UDP通信总结

【socket应用】基于C语言的天气客户端的实现

下面演示进程间通信的client-server的例子,以下测试代码主要实现的是client-server进行收发测试。

nanomsg_server.c:

#include
#include
#include
#include
#include
#include
#include
#include

#defineBUF_LEN100

char*url="tcp://127.0.0.1:2021";

intmain(void)
{
intserver_sock=0;
charbuf[BUF_LEN]={0};

if(server_sock=nn_socket(AF_SP,NN_PAIR)< 0)
 {
  printf("create server socket failed!
");
  return -1;
 }
 
 if (nn_bind(server_sock, url) < 0) 
 {
  printf("bind server sock failed!
");
  nn_close(server_sock);
  return -1;
 }
 printf("server init success!
");

 while (1)
 {
  if (nn_recv(server_sock, buf, sizeof(buf), 0) < 0) 
  {
   printf("recv failed!
");
   nn_close(server_sock);
   exit(EXIT_FAILURE);
  }
  else
  {
   printf("recieve client msg: %s
", buf);
   if (nn_send(server_sock, buf, sizeof(buf), 0) < 0)
   {
    printf("send failed!
");
    nn_close(server_sock);
    exit(EXIT_FAILURE);
   }
  }
 }

 nn_close(server_sock);

 return 0;
}

nanomsg_client.c:

#include
#include
#include
#include
#include
#include
#include
#include

#defineBUF_LEN100

char*url="tcp://127.0.0.1:2021";

intmain(void)
{
intclient_sock=0;
charbuf[BUF_LEN]={0};

if(client_sock=nn_socket(AF_SP,NN_PAIR)< 0)
 {
  printf("create server socket failed!
");
  return -1;
 }

 if (nn_connect(client_sock, url) < 0) 
 {
  printf("connect server sock failed!
");
  nn_close(client_sock);
  return -1;
 }

 printf("client init success!
");

 while (1)
 {
        scanf("%s", buf);
  if (nn_send(client_sock, buf, sizeof(buf), 0) < 0)
  {
   printf("send failed!
");
   nn_close(client_sock);
  }

        memset(buf, 0, BUF_LEN);   

  if (nn_recv(client_sock, buf, sizeof(buf), 0) >0)
{
printf("recieveservermsg:%s
",buf);
}
memset(buf,0,BUF_LEN);
}

nn_close(client_sock);

return0;
}

编译:

gccnanomsg_server.c-onanomsg_server-I/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/include-L/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib-lnanomsg
gccnanomsg_client.c-onanomsg_client-I/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/include-L/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib-lnanomsg

-I xxx:指定头文件路径。

-L xxx:指定库路径。

-lnanomsg:链接动态库nanomsg.so。

运行测试:

运行可能会出现如下错误:

760aa476-e3a1-11ec-ba43-dac502259ad0.png

不能找到共享库文件libtest_d.so,加载失败。因为一般情况下Linux会在/usr/lib路径中搜索需要用到的库,而libtest_d.so库并不在这个路径下。

解决方法有两种:一种就是把这个文件拷贝至/usr/lib路径下,但是一般不允许这样做,一般用户也不允许往这个路径里拷贝东西。另一种就是把当前路径增加为动态库的搜索路径,命令如:

export LD_LIBRARY_PATH=/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib:$LD_LIBRARY_PATH

然后继续运行:

763eb144-e3a1-11ec-ba43-dac502259ad0.png

可见,收发测试成功。以上就是本次关于nanomsg的简单使用分享,希望能对大家有帮助。

原文标题:实用 | 一个高性能通信库的简单使用分享

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10942

    浏览量

    206545
  • 网络协议
    +关注

    关注

    3

    文章

    239

    浏览量

    21347
  • 开源
    +关注

    关注

    3

    文章

    2960

    浏览量

    41602
  • 通信库
    +关注

    关注

    0

    文章

    3

    浏览量

    5549

原文标题:实用 | 一个高性能通信库的简单使用分享

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LC3网络技术演讲系列之一:基于VPP平台的网络服务优化

    做加解密等。这就需要提供一种进程间通信的机制。这里有很多种选择,比较直接的比如采用unix socket、netlink等,复杂一点采用TIPC等。我们采用了nanomsg来完成进程间通信,主要考虑
    发表于 07-23 14:02 3292次阅读

    分享一个高性能通信库的简单使用技巧

    nanomsg简介 nanomsg是一个实现了几种可扩展协议的高性能通信库;可扩展协议的任务是定义多个应用系统如何通信,从而组成一个大的分布式系统。 下载链接: https://github.com
    的头像 发表于 05-11 15:09 2028次阅读
    分享一个高性能通信库的简单使用技巧