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

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

3天内不再提示

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

FPGA之家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2021-05-11 15:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

nanomsg简介

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

下载链接:

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

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

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

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

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

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

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

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

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

INPROC:单进程内通信;

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

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

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

nanomsg编译/交叉编译

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

c5709ade-b20b-11eb-bf61-12bb97331649.png

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

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

c5963032-b20b-11eb-bf61-12bb97331649.png

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

1、编译

① cmake 。。 -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_x86_lib

② cmake --build 。

③ ctest 。

④ sudo cmake --build 。 --target install

⑤ sudo ldconfig

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

c5a066e2-b20b-11eb-bf61-12bb97331649.png

② :编译。

c5b1746e-b20b-11eb-bf61-12bb97331649.png

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

c5bd8f9c-b20b-11eb-bf61-12bb97331649.png

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

c6396428-b20b-11eb-bf61-12bb97331649.png

c647ed5e-b20b-11eb-bf61-12bb97331649.png

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

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

c65214fa-b20b-11eb-bf61-12bb97331649.png

2、交叉编译

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

c6622048-b20b-11eb-bf61-12bb97331649.png

然后输入如下命令:

① cmake 。。 -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_arm_lib

② cmake --build 。

③ sudo cmake --build 。 --target install

④ sudo ldconfig

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

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

c6943862-b20b-11eb-bf61-12bb97331649.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 《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

”);

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 《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!

”);

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(“recieve server msg: %s

”, 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

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

-L xxx:指定库路径。

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

运行测试:

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

c6e21852-b20b-11eb-bf61-12bb97331649.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

然后继续运行:

c70990b2-b20b-11eb-bf61-12bb97331649.png

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

编辑:jq

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

    关注

    8

    文章

    1433

    浏览量

    83772
  • IPC
    IPC
    +关注

    关注

    3

    文章

    383

    浏览量

    55067

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度剖析MAX5887:高性能DAC在通信领域的卓越应用

    深度剖析MAX5887:高性能DAC在通信领域的卓越应用 在当今无线通信和信号合成的前沿领域,数字模拟转换器(DAC)的性能直接决定了系统的整体表现。MAX5887作为
    的头像 发表于 04-22 15:00 79次阅读

    MAX5871:高性能RF DAC助力无线通信发展

    MAX5871:高性能RF DAC助力无线通信发展 在无线通信领域,高性能的射频数模转换器(RF DAC)对于实现高效、稳定的信号传输至关重要。今天我们要介绍的MAX5871,就是
    的头像 发表于 04-22 14:10 63次阅读

    高性能射频 DAC MAX5869:开启通信设计新境界

    高性能射频 DAC MAX5869:开启通信设计新境界 在当今通信技术飞速发展的时代,高性能射频数模转换器(DAC)在各种通信系统中扮演着至
    的头像 发表于 04-22 14:05 43次阅读

    AD6649 IF多样性接收器:高性能通信解决方案

    AD6649 IF多样性接收器:高性能通信解决方案 引言 在通信领域,对于高性能、低成本、小尺寸的中频(IF)接收器的需求日益增长。AD6649作为
    的头像 发表于 03-31 10:05 347次阅读

    Mobile新手必看:快速实现移动通信的极简方案

     对于刚接触移动开发的程序员来说,通信功能往往是道门槛。而Mobile的出现,让这切变得简单。无需掌握复杂的系统机制,只需引入库并调用
    的头像 发表于 01-26 16:57 389次阅读
    Mobile<b class='flag-5'>库</b>新手必看:快速实现移动<b class='flag-5'>通信</b>的极简方案

    高性能多通道收发器AFE80xx系列:雷达与通信领域的新利器

    高性能多通道收发器AFE80xx系列:雷达与通信领域的新利器 在电子工程领域,高性能、宽带宽的多通道收发器直是雷达、通信等众多应用的核心组
    的头像 发表于 01-26 15:15 844次阅读

    GT-BGA-2002高性能BGA测试插座

    GT-BGA-2002高性能BGA测试插座GT-BGA-2002是Ironwood Electronics 的GT Elastomer系列的高性能BGA测试插座,专为高频高速信号测试设计,兼容多数
    发表于 12-18 10:00

    炎核开源开放平台上架推出OpenSparseBlas高性能稀疏计算

    在科学计算与工程仿真领域,高效处理大规模稀疏矩阵运算是提升整体计算效能的关键。为此,我们在炎核开源开放平台上架推出 OpenSparseBlas——专为稀疏矩阵/向量计算而打造的高性能稀疏计算
    的头像 发表于 12-15 15:18 980次阅读

    同步、GNSS 与卫星通信的板级时钟方案:为什么高性能 TCXO 仍是关键

    在高等级通信同步、GNSS 授时节点与卫星/微波射频模块中,工程师常遇到同一个现实约束:中心参考需要极致短期稳定与低相噪,而分布式板卡/模块又必须控制体积、功耗与成本。 因此,“中心OCXO + 板级/模块级高性能TCXO/VC
    的头像 发表于 12-08 19:22 2368次阅读
    同步、GNSS 与卫星<b class='flag-5'>通信</b>的板级时钟方案:为什么<b class='flag-5'>高性能</b> TCXO 仍是关键<b class='flag-5'>一</b>层

    蓝牙5.0双模通信与专业级音频处理能力于体的高性能蓝牙芯片-BP1048B2

    BP1048B2是高性能的蓝牙音频应用处理器,集32位RISC内核、蓝牙5.0双模通信与专业级音频处理能力于体的高性能芯片,集成音频编
    的头像 发表于 12-03 10:06 1051次阅读
    蓝牙5.0双模<b class='flag-5'>通信</b>与专业级音频处理能力于<b class='flag-5'>一</b>体的<b class='flag-5'>高性能</b>蓝牙芯片-BP1048B2

    推荐高性能存储psram芯片

    智能穿戴、物联网设备和端侧AI应用快速发展,PSRAM伪静态随机存储器,正成为越来越多嵌入式系统的优选方案,如何选择高性能、小尺寸与低功耗的psram芯片是
    的头像 发表于 11-18 17:24 685次阅读

    华纳云为游戏数据选择高性能NVMe SSD存储

    游戏数据对速度、可靠性和可扩展性有极高要求。随着在线游戏的发展,开发者越来越依赖NVMe SSD存储来提供服务器租用和服务器托管解决方案。本文将指导您了解为游戏数据选择高性能NVMe SSD存储
    的头像 发表于 09-30 16:03 1199次阅读

    高性能低功耗双核Wi-Fi6+BLE5.3二合

    随着物联网技术的不断发展,无线通信模块在各种应用场景中扮演着越来越重要的角色。近日,蓝科迅通科技宣布推出款基于Nordic Semiconductor的Wi-Fi 6芯片nRF7002和高性能双核
    发表于 06-28 21:42

    使用树莓派构建 Slurm 高性能计算集群:分步指南!

    在这篇文章中,我将分享我尝试使用树莓派构建Slurm高性能计算集群的经历。段时间前,我开始使用这个集群作为测试平台,来创建更大的、支持GPU计算的
    的头像 发表于 06-17 16:27 1960次阅读
    使用树莓派构建 Slurm <b class='flag-5'>高性能</b>计算集群:分步指南!

    NC403(C50)高性能噪声二极管现货库存

    NC403(C50)高性能噪声二极管现货库存NC403(C50)是Noisecom推出的高性能微波噪声二极管,专为射频和微波应用设计。NC403(C50)采用C50封装,适用于需要表面贴装
    发表于 06-03 10:31