DBus如何傳送和接收資料,包括結構體

2021-07-31 20:16:18 字數 2520 閱讀 8807

dbus是程序間通訊的工具。網上的資料不太多,大都又是基於glib或python的。在windows下如果要用純c/c++語言,似乎只能用原始的dbus庫來編寫程式。倘若不親自寫寫,還真不知道到底是怎樣的。

dbus的資料都要繫結在訊息上:

訊息: dbusmessage

資料: dbusmessageiter

從資料結構的命名上看,與其稱之為訊息的資料,不如稱為訊息資料的迭代器。

事實上其資料的操作過程,就是個迭代過程。

// todo: 向連線傳送並flush

以上是傳送,接收此單個bool資料也很簡單:

dbusmessageiter datarecievediter; // 接收資料迭代器

dbus_bool_t singledata; // 儲存傳送過來的bool變數

dbus_message_iter_init(&msg, &datarecievediter); // 生成msg訊息的資料迭代器

if (dbus_message_iter_get_arg_type(&datarecievediter) == dbus_type_boolean)

ii 傳輸數個變數或陣列

如傳輸乙個bool變數,乙個char*字串和乙個int陣列

對於傳送有:

dbusmessage msg;

dbusmessageiter datatosenditer;

dbus_bool_t boolarg = true; // 要傳送的bool變數

char strarg = "i am a string"; // 要傳送的字串

int *intarrayarg = getintarray(); // 要傳送的int陣列,getintarray()給intarrayarg初始化賦值

由於要傳輸的資料報含這三種資料型別,該資料實際上是乙個由這三組資料組成的結構

在windows dbus中需以專門的**來處理

dbusmessageiter substructiter;

dbus_message_iter_open_container(&datatosenditer, 

dbus_type_struct, // 開啟子迭代的型別

null,

&substructiter); // 要被初始化為子迭代的迭代器

dbus_message_iter_close_container(&substructiter, &subarrayiter);

dbus_message_iter_close_container(&datatosenditer, &substructiter);

對於接收有:

dbusmessageiter datarecievediter;

// 宣告用於接受資料的變數

dbus_bool_t boolarg;

char *strarg;

int *intarrayarg;

dbus_message_iter_init(msg, &datarecievediter); // 用msg資料初始化資料迭代器

pan class="comment">// 對於迭代中的每一層,都需專門解開處理

dbusmessageiter substructiter;

dbus_message_iter_recurse(&datarecievediter, &substructiter); // 將迭代器中打包的資料解開給子迭代

// 以下每步都需判斷資料型別,為清晰略去

dbus_message_iter_get_basic(&substructiter,&boolarg);

dbus_message_iter_next(&substructiter); // 步進,相當於指標指向下個資料

dbus_message_iter_get_basic(&substructiter, &strarg);

dbus_message_iter_next(&substructiter);

dbusmessageiter subarrayiter;

dbus_message_iter_recurse(&substructiter, &subarrayiter); //解開下層迭代

int elementnum; 

dbus_message_iter_get_fixed_array(&subarrayiter, &intarrayiter, &elementnum); // 獲得陣列指標以及元素個數

由上**可知,無論做否資料型別的判斷,傳輸資料的格式傳送與接收雙方應該定義好。linux上的dbus-glib支援對於xml定義的解析自動生成標頭檔案,方便的解決了這個問題。

對於傳輸資料的記憶體釋放,除了傳送的具體資料外,迭代器不需專門釋放,但是訊息需要解引用。

另外,對於成分十分複雜的資料,實際上可以事先定義乙個足夠大的結構,將所有要傳輸的資料都放在裡面,比如:

typedef struct

largestruct;

然後用如下**來傳送:

largestruct data;

// 初始化...

// ...

網絡卡如何傳送和接收資料報

網絡卡如何傳送資料報 文章出處 http blog.21ic.org user1 1066 archives 2007 40803.html ip報文可以看作乙個包。linux網絡卡驅動程式,將ip包新增14位元組的mac包頭,構成mac包。mac包中含有傳送端和接收端的mac位址資訊。既然是驅動程...

LWIP 資料接收和傳送

在znyq的sdk例程中,main中主迴圈傳送接收,其中接收為 xemacif input echo netif 查詢xemacit input 函式裡 在echo.c裡有receive的處理函式recv callback 資料接收 tcp recved tpcb,p len 其中的tcp recv...

socket傳送和接收資料

1 sendbuf sendtext sendstream 幾乎所有的通訊控制項都會提供上面的3個方法。首先看看sendbuf function tcustomwinsocket.sendbuf var buf count integer integer varerrorcode integer b...