网站首页 > 文章精选 正文
前言
最近的工作中也有用到nanomsg,本篇推文来简单分享一下nanomsg的基本使用。
nanomsg简介
nanomsg是一个实现了几种可扩展协议的高性能通信库;可扩展协议的任务是定义多个应用系统如何通信,从而组成一个大的分布式系统。
下载链接:
https://github.com/gaobaoru/nanomsg/
当前版本nanomsg支持以下协议:
- 配对模式:简单的一对一的通信;
- 总线模式:简单的多对多的通信;
- 请求/回复模式:支持组建大规模的集群服务来处理用户请求;
- 扇入模式:支持从多个源聚合请求消息;
- 扇出模式:支持分配到多个节点以支持负载均衡;
- 调查模式:允许在一个单一的请求里检查多个应用的状态;
可扩展协议是在网络通信协议之上实现的,当前版本nanomsg支持以下几种传输机制:
- INPROC:单进程内通信;
- IPC:单机内多进程的通信;
- TCP:通过tcp协议的网络通信;
nanomsg用c实现,不依赖系统特性,所以支持多个操作系统。
nanomsg编译/交叉编译
按照上面的链接下载后得到:
首先创建一个build文件夹用于管理我们编译所需、编译生成的一些文件。
这里,我们演示编译/交叉编译,首先在build目录下分别创建如下两个文件夹存放我们待会编译得到的x86_lib、arm_lib:
然后在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目录。
② :编译。
③ :测试。CMake 提供了一个称为 CTest 的测试工具,nanomsg项目根目录的 CMakeLists 文件中调用了 add_test 命令进行测试。
④ :安装。把编译生成的库及相关头文件安装到nanomsg_x86_lib目录中。
⑤ :让生成的nanomsg动态链接库为系统所共享。ldconfig是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。
查看生成的动态库是否是x86架构的:
2、交叉编译
在nanomsg根目录下的CMakeLists.txt文件里加上交叉编译器设置:
然后输入如下命令:
① cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_arm_lib
② cmake --build .
③ sudo cmake --build . --target install
④ sudo ldconfig
与上面的编译x86的nanomsg 库的步骤差不多,这里把测试的指令ctest .去掉了,因为生成的可执行文件是arm架构的,所以直接运行测试会出错。
查看生成的动态库是否是arm架构的:
nanomsg使用例子
nanomsg可用于多线程、多进程、多机通信。nanomsg是一个socket library,所以其应用接口与标准的socket接口差不多,只是多了前缀nn_,如nn_socket、nn_close、nn_send、nn_recv等。关于socket可查阅往期笔记:TCP、UDP通信总结
下面演示进程间通信的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!\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/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。
运行测试:
运行可能会出现如下错误:
不能找到共享库文件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
然后继续运行:
可见,收发测试成功。以上就是本次关于nanomsg的简单使用分享,如果文章对你有帮助,麻烦帮忙转发,谢谢!
猜你喜欢:
1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!
猜你喜欢
- 2025-01-10 centos 7 升级OpenSSH
- 2025-01-10 Linux动态库和静态库教程
- 2025-01-10 Linux入门系列——软件包管理
- 2025-01-10 AI模型搭建-3
- 2025-01-10 AI模型搭建-2
- 2025-01-10 在深度Linux玩Windows游戏,可以这样安装wine的最新版
- 2025-01-10 ubuntu24.04 vscode调用 c++ opencv报错问题
- 2025-01-10 Nginx使用Lua-nginx模块脚本连接Redis数据库读取静态资源
- 2025-01-10 ffmpeg安装方式及配合python使用
- 2025-01-10 如何修改容器时间而不改变宿主机时间?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)