0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一個高性能通信庫的簡單使用技巧

FPGA之家 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2021-05-11 15:09 ? 次閱讀

nanomsg簡介

nanomsg是一個實現(xiàn)了幾種可擴展協(xié)議的高性能通信庫;可擴展協(xié)議的任務(wù)是定義多個應(yīng)用系統(tǒng)如何通信,從而組成一個大的分布式系統(tǒng)。

下載鏈接:

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

當(dāng)前版本nanomsg支持以下協(xié)議:

配對模式:簡單的一對一的通信;

總線模式:簡單的多對多的通信;

請求/回復(fù)模式:支持組建大規(guī)模的集群服務(wù)來處理用戶請求;

扇入模式:支持從多個源聚合請求消息;

扇出模式:支持分配到多個節(jié)點以支持負(fù)載均衡;

調(diào)查模式:允許在一個單一的請求里檢查多個應(yīng)用的狀態(tài);

可擴展協(xié)議是在網(wǎng)絡(luò)通信協(xié)議之上實現(xiàn)的,當(dāng)前版本nanomsg支持一下網(wǎng)絡(luò)協(xié)議:

INPROC:單進程內(nèi)通信;

IPC:單機內(nèi)多進程的通信;

TCP:通過tcp協(xié)議的網(wǎng)絡(luò)通信;

nanomsg用c實現(xiàn),不依賴系統(tǒng)特性,所以支持多個操作系統(tǒng)。

nanomsg編譯/交叉編譯

按照上面的鏈接下載后的到:

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

首先創(chuàng)建一個build文件夾用于管理我們編譯所需、編譯生成的一些文件。

這里,我們演示編譯/交叉編譯,首先在build目錄下分別創(chuàng)建如下兩個文件夾存放我們待會編譯得到的x86_lib、arm_lib:

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

然后在build路徑下根據(jù)自己的需要輸入如下命令生成Makefile、進行編譯/交叉編譯、測試:

1、編譯

① cmake 。。 -DCMAKE_INSTALL_PREFIX=$PWD/nanomsg_x86_lib

② cmake --build 。

③ ctest 。

④ sudo cmake --build 。 --target install

⑤ sudo ldconfig

① :/usr/local/ 是默認(rèn)安裝到的根目錄,可以通過修改 CMAKE_INSTALL_PREFIX 變量的值來指定這些文件應(yīng)該拷貝到哪個目錄,這里我們指定到當(dāng)前目錄的nanomsg_x86_lib目錄。

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

② :編譯。

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

③ :測試。CMake 提供了一個稱為 CTest 的測試工具,nanomsg項目根目錄的 CMakeLists 文件中調(diào)用了 add_test 命令進行測試。

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

④ :安裝。把編譯生成的庫及相關(guān)頭文件安裝到nanomsg_x86_lib目錄中。

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

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

⑤ :讓生成的nanomsg動態(tài)鏈接庫為系統(tǒng)所共享。ldconfig是一個動態(tài)鏈接庫管理命令,其目的為了讓動態(tài)鏈接庫為系統(tǒng)所共享。

查看生成的動態(tài)庫是否是x86架構(gòu)的:

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

2、交叉編譯

在nanomsg根目錄下的CMakeLists.txt文件里加上交叉編譯器設(shè)置:

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 。去掉了,因為生成的可執(zhí)行文件是arm架構(gòu)的,所以直接運行測試會出錯。

查看生成的動態(tài)庫是否是arm架構(gòu)的:

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

nanomsg使用例子

nanomsg可用于多線程、多進程、多機通信。nanomsg是一個socket library,所以其應(yīng)用接口與標(biāo)準(zhǔn)的socket接口差不多,只是多了前綴nn_,如nn_socket、nn_close、nn_send、nn_recv等。關(guān)于socket可查閱往期筆記:

【socket筆記】TCP、UDP通信總結(jié)

【socket應(yīng)用】基于C語言的天氣客戶端的實現(xiàn)

下面演示進程間通信的client-server的例子,以下測試代碼主要實現(xiàn)的是client-server進行收發(fā)測試。

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:鏈接動態(tài)庫nanomsg.so。

運行測試:

運行可能會出現(xiàn)如下錯誤:

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

不能找到共享庫文件libtest_d.so,加載失敗。因為一般情況下Linux會在/usr/lib路徑中搜索需要用到的庫,而libtest_d.so庫并不在這個路徑下。

解決方法有兩種:一種就是把這個文件拷貝至/usr/lib路徑下,但是一般不允許這樣做,一般用戶也不允許往這個路徑里拷貝東西。另一種就是把當(dāng)前路徑增加為動態(tài)庫的搜索路徑,命令如:

export LD_LIBRARY_PATH=/home/book/git_clone/nanomsg/build/nanomsg_x86_lib/lib:$LD_LIBRARY_PATH

然后繼續(xù)運行:

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

可見,收發(fā)測試成功。以上就是本次關(guān)于nanomsg的簡單使用分享,希望能對大家有幫助。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78759
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    333

    瀏覽量

    51623

原文標(biāo)題:實用 | 一個高性能通信庫的簡單使用分享

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    兼具高性能和低功耗,物奇微自研RISC-V高性能通信Wi-Fi 6芯片

    論壇上,物奇微自研RISC-V高性能通信的Wi-Fi 6 芯片WQ9201獲得推介。 ? 重慶物奇微電子股份有限公司CTO林豪表示,物奇微成立于2016年,在重慶、上海、長沙、香港、深圳等地設(shè)有研發(fā)
    的頭像 發(fā)表于 08-19 16:47 ?1720次閱讀
    兼具<b class='flag-5'>高性能</b>和低功耗,物奇微自研RISC-V<b class='flag-5'>高性能</b><b class='flag-5'>通信</b>Wi-Fi 6芯片

    帶你了解什么是高性能計算(HPC)

    受益于HPC更高的速度處理大量數(shù)據(jù)的能力,全球正在進入HPC大周期,高性能計算的發(fā)展水平已經(jīng)成為衡量國家綜合實力和高科技發(fā)展水平的重要標(biāo)志,美國、歐盟、日本、英國都高度重視高性能
    的頭像 發(fā)表于 07-20 08:28 ?309次閱讀
    帶你了解什么是<b class='flag-5'>高性能</b>計算(HPC)

    技術(shù)巔峰!探秘國內(nèi)高性能模擬芯片的未來發(fā)展

    隨著科技的飛速發(fā)展和數(shù)字化轉(zhuǎn)型的深入推進,高性能模擬芯片作為連接現(xiàn)實世界與數(shù)字世界的橋梁,其重要性日益凸顯。國內(nèi)高性能模擬芯片產(chǎn)業(yè)在經(jīng)歷了多年的技術(shù)積累與市場磨礪后,正站在新的歷史
    的頭像 發(fā)表于 06-22 09:47 ?301次閱讀
    技術(shù)巔峰!探秘國內(nèi)<b class='flag-5'>高性能</b>模擬芯片的未來發(fā)展

    推薦簡單易用、高性能的專門用于433/315Mhz的射頻ICXL4456

    XL4456是簡單易用,高性能的專門用于433&315Mhz的射頻IC,使用SOT23-6封裝。
    的頭像 發(fā)表于 05-10 11:45 ?466次閱讀
    推薦<b class='flag-5'>一</b>顆<b class='flag-5'>簡單</b>易用、<b class='flag-5'>高性能</b>的專門用于433/315Mhz的射頻ICXL4456

    移遠通信再推多款高性能天線產(chǎn)品

    全球物聯(lián)網(wǎng)整體解決方案的佼佼者移遠通信宣布再次擴充其天線產(chǎn)品線。此次推出的多款高性能天線旨在滿足物聯(lián)網(wǎng)市場對高品質(zhì)天線不斷增長的需求。新產(chǎn)品線中,衛(wèi)星天線YETN001L1A、三合組合天線YEMA300QXA和YEMN302Q
    的頭像 發(fā)表于 05-06 14:32 ?414次閱讀

    高性能 Flybuck

    應(yīng)用的性能和效率。其次,增加同步整流器將減少次級側(cè)損耗,并改善輸出電壓調(diào)節(jié)。最后種方法將通過添加光耦合器來調(diào)節(jié)輸出電壓,從而進步改善
    的頭像 發(fā)表于 03-18 13:54 ?4473次閱讀
    <b class='flag-5'>高性能</b> Flybuck

    開放式高實時高性能PLC控制器解決方案-基于米爾電子STM32MP135

    實時高性能需求尤其突出。面對以上挑戰(zhàn),合作伙伴翌控科技基于米爾STM32MP135開發(fā)板發(fā)布開放式高實時高性能PLC控制器解決方案,將高精準(zhǔn)數(shù)據(jù)采集、預(yù)處理、存儲、通信與高實時控制融為
    發(fā)表于 03-07 20:06

    QT串口通信簡單使用

    QT串口通信是上位機和下位機通信常用的通信方式, 也是學(xué)習(xí)QT必須學(xué)會的基礎(chǔ)知識, 這篇就簡單介紹下QT串口
    的頭像 發(fā)表于 01-15 09:27 ?1422次閱讀
    QT串口<b class='flag-5'>通信</b>的<b class='flag-5'>簡單</b>使用

    mysql怎么新建個數(shù)據(jù)庫

    mysql怎么新建個數(shù)據(jù)庫 如何新建個數(shù)據(jù)庫在MySQL中 創(chuàng)建個數(shù)據(jù)庫是MySQL中的基
    的頭像 發(fā)表于 12-28 10:01 ?715次閱讀

    高性能多通道通用DMA設(shè)計與實現(xiàn)

    為充分發(fā)揮異構(gòu)多核DSP芯片的實時計算能力,設(shè)計并實現(xiàn)了高性能多通道的通用DMA,該DMA最大支持64通道的數(shù)據(jù)搬運,并支持維、二維、轉(zhuǎn)置以及級聯(lián)描述符等多種傳輸模式。芯片實測
    的頭像 發(fā)表于 11-20 15:52 ?1064次閱讀
    <b class='flag-5'>一</b>種<b class='flag-5'>高性能</b>多通道通用DMA設(shè)計與實現(xiàn)

    mysql是什么類型的數(shù)據(jù)

    MySQL是種關(guān)系型數(shù)據(jù)管理系統(tǒng)(RDBMS),用于存儲和管理大量結(jié)構(gòu)化數(shù)據(jù)。它被廣泛用于各種應(yīng)用程序和網(wǎng)站的后端,包括電子商務(wù)平臺、社交媒體網(wǎng)站、金融系統(tǒng)等等。MySQL的特點是性能高、可靠性
    的頭像 發(fā)表于 11-16 14:43 ?1434次閱讀

    Nginx 如何實現(xiàn)高性能低消耗

    。Nginx具有豐富的模塊、靈活的配置、較低資源消耗等優(yōu)點。下面,我們起深入看下Nginx的工作機制 1. Nginx 如何實現(xiàn)高性能低消耗的呢? 我們從以下幾個方面說明以下:
    的頭像 發(fā)表于 11-11 11:31 ?496次閱讀
    Nginx 如何實現(xiàn)<b class='flag-5'>高性能</b>低消耗

    如何寫簡單的裝飾器

    今天介紹的是已經(jīng)存在十三年,但是依舊不紅的 decorator,好像很少有人知道他的存在樣。 這個可以幫你做什么呢 ? 其實很
    的頭像 發(fā)表于 11-01 09:54 ?402次閱讀
    如何寫<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>簡單</b>的裝飾器

    STM32 HAL串口收發(fā)是如何使用的?

    ,它提供了簡單易用的方法來使用STM32的各種外設(shè)。 本文將詳細(xì)介紹如何使用STM32 HAL來進行串口
    的頭像 發(fā)表于 10-26 17:42 ?1082次閱讀

    TinyDB :純Python編寫的輕量級數(shù)據(jù)

    TinyDB 是純 Python 編寫的輕量級數(shù)據(jù),共只有1800行代碼,沒有外部依賴項。 TinyDB的目標(biāo)是降低小型 Python 應(yīng)用程序使用數(shù)據(jù)
    的頭像 發(fā)表于 10-21 10:22 ?733次閱讀