实用一个高性能通信库的简单使用分享
前言
最近的工作中也有用到nanomsg,本篇推文来简单分享一下nanomsg的基本使用。nanomsg简介
nanomsg是一个实现了几种可扩展协议的高性能通信库;可扩展协议的任务是定义多个应用系统如何通信,从而组成一个大的分布式系统。
下载链接:
https:github。comgaobaorunanomsg
当前版本nanomsg支持以下协议:配对模式:简单的一对一的通信;总线模式:简单的多对多的通信;请求回复模式:支持组建大规模的集群服务来处理用户请求;扇入模式:支持从多个源聚合请求消息;扇出模式:支持分配到多个节点以支持负载均衡;调查模式:允许在一个单一的请求里检查多个应用的状态;
可扩展协议是在网络通信协议之上实现的,当前版本nanomsg支持以下几种传输机制:INPROC:单进程内通信;IPC:单机内多进程的通信;TCP:通过tcp协议的网络通信;
nanomsg用c实现,不依赖系统特性,所以支持多个操作系统。nanomsg编译交叉编译
按照上面的链接下载后得到:
首先创建一个build文件夹用于管理我们编译所需、编译生成的一些文件。
这里,我们演示编译交叉编译,首先在build目录下分别创建如下两个文件夹存放我们待会编译得到的x86lib、armlib:
然后在build路径下根据自己的需要输入如下命令生成Makefile、进行编译交叉编译、测试:
1、编译cmake。。DCMAKEINSTALLPREFIXPWDnanomsgx86libcmakebuild。ctest。sudocmakebuild。targetinstallsudoldconfig
:usrlocal是默认安装到的根目录,可以通过修改CMAKEINSTALLPREFIX变量的值来指定这些文件应该拷贝到哪个目录,这里我们指定到当前目录的nanomsgx86lib目录。
:编译。
:测试。CMake提供了一个称为CTest的测试工具,nanomsg项目根目录的CMakeLists文件中调用了addtest命令进行测试。
:安装。把编译生成的库及相关头文件安装到nanomsgx86lib目录中。
:让生成的nanomsg动态链接库为系统所共享。ldconfig是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。
查看生成的动态库是否是x86架构的:
2、交叉编译
在nanomsg根目录下的CMakeLists。txt文件里加上交叉编译器设置:
然后输入如下命令:cmake。。DCMAKEINSTALLPREFIXPWDnanomsgarmlibcmakebuild。sudocmakebuild。targetinstallsudoldconfig
与上面的编译x86的nanomsg库的步骤差不多,这里把测试的指令ctest。去掉了,因为生成的可执行文件是arm架构的,所以直接运行测试会出错。
查看生成的动态库是否是arm架构的:
nanomsg使用例子
nanomsg可用于多线程、多进程、多机通信。nanomsg是一个socketlibrary,所以其应用接口与标准的socket接口差不多,只是多了前缀nn,如nnsocket、nnclose、nnsend、nnrecv等。关于socket可查阅往期笔记:TCP、UDP通信总结
下面演示进程间通信的clientserver的例子,以下测试代码主要实现的是clientserver进行收发测试。
nanomsgserver。c:微信公众号:嵌入式大杂烩includestdio。hincludepthread。hincludestdlib。hincludestring。hincludeunistd。hincludenanomsgpair。hincludenanomsgbus。hincludenanomsgnn。hdefineBUFLEN100charurltcp:127。0。0。1:2021;intmain(void){intserversock0;charbuf〔BUFLEN〕{0};if(serversocknnsocket(AFSP,NNPAIR)0){printf(createserversocketfailed!);return1;}if(nnbind(serversock,url)0){printf(bindserversockfailed!r);nnclose(serversock);return1;}printf(serverinitsuccess!);while(1){if(nnrecv(serversock,buf,sizeof(buf),0)0){printf(recvfailed!);nnclose(serversock);exit(EXITFAILURE);}else{printf(recieveclientmsg:sr,buf);if(nnsend(serversock,buf,sizeof(buf),0)0){printf(sendfailed!r);nnclose(serversock);exit(EXITFAILURE);}}}nnclose(serversock);return0;}
nanomsgclient。c:微信公众号:嵌入式大杂烩includestdio。hincludepthread。hincludestdlib。hincludestring。hincludeunistd。hincludenanomsgpair。hincludenanomsgbus。hincludenanomsgnn。hdefineBUFLEN100charurltcp:127。0。0。1:2021;intmain(void){intclientsock0;charbuf〔BUFLEN〕{0};if(clientsocknnsocket(AFSP,NNPAIR)0){printf(createserversocketfailed!);return1;}if(nnconnect(clientsock,url)0){printf(connectserversockfailed!r);nnclose(clientsock);return1;}printf(clientinitsuccess!);while(1){scanf(s,buf);if(nnsend(clientsock,buf,sizeof(buf),0)0){printf(sendfailed!r);nnclose(clientsock);}memset(buf,0,BUFLEN);if(nnrecv(clientsock,buf,sizeof(buf),0)0){printf(recieveservermsg:sr,buf);}memset(buf,0,BUFLEN);}nnclose(clientsock);return0;}
编译:gccnanomsgserver。conanomsgserverIhomebookgitclonenanomsgbuildnanomsgx86libincludeLhomebookgitclonenanomsgbuildnanomsgx86libliblnanomsggccnanomsgclient。conanomsgclientIhomebookgitclonenanomsgbuildnanomsgx86libincludeLhomebookgitclonenanomsgbuildnanomsgx86libliblnanomsgIxxx:指定头文件路径。Lxxx:指定库路径。lnanomsg:链接动态库nanomsg。so。
运行测试:
运行可能会出现如下错误:
不能找到共享库文件libtestd。so,加载失败。因为一般情况下Linux会在usrlib路径中搜索需要用到的库,而libtestd。so库并不在这个路径下。
解决方法有两种:一种就是把这个文件拷贝至usrlib路径下,但是一般不允许这样做,一般用户也不允许往这个路径里拷贝东西。另一种就是把当前路径增加为动态库的搜索路径,命令如:
exportLDLIBRARYPATHhomebookgitclonenanomsgbuildnanomsgx86liblib:LDLIBRARYPATH
然后继续运行:
可见,收发测试成功。以上就是本次关于nanomsg的简单使用分享,如果文章对你有帮助,麻烦帮忙转发,谢谢!猜你喜欢:
Protobuf:一种更小、更快、更高效的协议
分享一个基于全平台GUI库GUILite的简易万年历
1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!