点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!

前言

上次的推文中有提到过,正好最近的工作中也有用到,本篇推文来简单分享一下的基本使用。

简介

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

下载链接:

当前版本支持以下协议:

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

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

编译/交叉编译

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

头文件memory_头文件和源文件的区别_memset头文件

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

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

头文件memory_memset头文件_头文件和源文件的区别

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

1、编译

① cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_x86_lib
② cmake --build .
③ ctest .
④ sudo cmake --build . --target install
⑤ sudo ldconfig

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

memset头文件_头文件和源文件的区别_头文件memory

② :编译。

memset头文件_头文件memory_头文件和源文件的区别

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

头文件memory_memset头文件_头文件和源文件的区别

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

头文件memory_头文件和源文件的区别_memset头文件

memset头文件_头文件和源文件的区别_头文件memory

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

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

头文件和源文件的区别_memset头文件_头文件memory

2、交叉编译

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

然后输入如下命令:

① cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_arm_lib
② cmake --build .
③ sudo cmake --build . --target install
④ sudo ldconfig

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

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

头文件和源文件的区别_memset头文件_头文件memory

使用例子

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

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

.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!rn");
  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: %srn", buf);
   if (nn_send(server_sock, buf, sizeof(buf), 0) < 0)
   {
    printf("send failed!rn");
    nn_close(server_sock);
    exit(EXIT_FAILURE);
   }
  }
 }

 nn_close(server_sock);

 return 0;
}

.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!rn");
  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!rn");
   nn_close(client_sock);
  }

        memset(buf, 0, BUF_LEN);   

  if (nn_recv(client_sock, buf, sizeof(buf), 0) > 0
  {
   printf("recieve server msg: %srn", buf);
  }
        memset(buf, 0, BUF_LEN);   
 }

 nn_close(client_sock);

 return 0;
}

编译:

gcc nanomsg_server.c -o nanomsg_server -I /home/book/git_clone/nanomsg/build/nanomsg_x86_lib/include -L /home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib -lnanomsg
gcc nanomsg_client.c -o nanomsg_client -I /home/book/git_clone/nanomsg/build/nanomsg_x86_lib/include -L /home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib -lnanomsg

运行测试:

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

memset头文件_头文件和源文件的区别_头文件memory

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

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

=/home/book///build//lib:$

然后继续运行:

头文件memory_头文件和源文件的区别_memset头文件

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注