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可查閱往期筆記:
【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。
運行測試:
運行可能會出現如下錯誤:
不能找到共享庫文件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的簡單使用分享,希望能對大家有幫助。
編輯:jq
-
TCP
+關注
關注
8文章
1378瀏覽量
79309 -
IPC
+關注
關注
3文章
352瀏覽量
52075
原文標題:實用 | 一個高性能通信庫的簡單使用分享
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
鴻蒙原生頁面高性能解決方案上線OpenHarmony社區 助力打造高性能原生應用
使用Python進行串口通信的案例
簡單認識libmodbus開發庫
![<b class='flag-5'>簡單</b>認識libmodbus開發<b class='flag-5'>庫</b>](https://file1.elecfans.com/web1/M00/F4/F5/wKgZoWc0WO2AbJmpAAAztc5uoPA692.png)
移遠通信推出八款高性能天線新品
摩爾線程開源高性能線性代數模板庫MUTLASS
兼具高性能和低功耗,物奇微自研RISC-V高性能通信Wi-Fi 6芯片
![兼具<b class='flag-5'>高性能</b>和低功耗,物奇微自研RISC-V<b class='flag-5'>高性能</b><b class='flag-5'>通信</b>Wi-Fi 6芯片](https://file1.elecfans.com/web2/M00/04/49/wKgaombDByOAcbdvABhY1k362WM101.png)
帶你了解什么是高性能計算(HPC)
![帶你了解什么是<b class='flag-5'>高性能</b>計算(HPC)](https://file.elecfans.com/web2/M00/4E/DC/poYBAGLCjeiALm_WAAAYmfR7Qec474.png)
Memcached介紹和詳解
技術巔峰!探秘國內高性能模擬芯片的未來發展
![技術巔峰!探秘國內<b class='flag-5'>高性能</b>模擬芯片的未來發展](https://file1.elecfans.com/web2/M00/F1/DE/wKgZomZ2LRCAB-yNAABP2i-S8yE798.png)
移遠通信再推多款高性能天線產品
Silicon Labs推出其新一代高性能MCU藍牙模組HCM511S
基于薄膜鈮酸鋰的高性能集成光子學研究
![基于薄膜鈮酸鋰的<b class='flag-5'>高性能</b>集成光子學研究](https://file1.elecfans.com/web2/M00/C5/F8/wKgZomYD5NiAaG3yAAAKQXP0GFI229.jpg)
評論