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...