书信模板dbug学习文档_第1页
书信模板dbug学习文档_第2页
书信模板dbug学习文档_第3页
书信模板dbug学习文档_第4页
书信模板dbug学习文档_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、D-bus体系的组成:1. libdbus库,提供给各个应用程序调用,使应用程序具有通信和数据交换的能力,两个应用程序可以直接进行通信,就像是一条socket通道,两个程序之间建立通道之后,就可以通讯了。2. 消息守护进程,在libdbus的基础上创建,可以管理多个应用程序之间的通信。每个应用程序都和消息守护进程建立dbus的链接,然后由消息守护进程进行消息的分派。3. 各种包装库,有libdbus-glib,libdbus-qt等等,目的是将dbus的底层api进行一下封装。D-bus的特点:1. 协议是低延迟而且低开销的,设计得小而高效,以便最小化传送的往返时间。另外,协议2. 是二进制的

2、,而不是文本的,这样就排除了费时的序列化过程。由于只面向本地机器处理的使用情形,所以所有的消息都以其自然字节次序发送。字节次序在每个消息中声明,所以如果一个 D-BUS 消息通过网络传输到远程的主机,它仍可以被正确地识别出来。 3. 从开发者的角度来看,D-BUS 是易于使用的。有线协议容易理解,客户机程序库以直观的方式对其进行包装。 D-bus 的内部工作方式:1. 系统总线(systembus),它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。2. 会话总线(sessionbuses),这些总线当用户登录后启动,

3、属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。3. 如果一个应用程序需要接收来自系统总线的消息,它不如直接连接到系统总线 不过,它可以发送的消息将是受限的。 一旦应用程序连接到了一个总线,它们就必须通过添加 匹配器(matchers)来声明它们希望收到哪种消息。匹配器为可以基于接口、对象路径和方法进行接收的消息指定一组规则。这样就使得应用程序可以集中精力去处理它们想处理的内容,以实现消息的高效路由,并保持总线上消息的预期数量,以使得不会因为这些消息导致所有应用程序的性能下降并变得很慢。D-bus的三层架构:1. 接口层:接口层由函数库libdbus提供,进程可通过该库使

4、用D-Bus的能力。2. 总线层:总线层实际上是由D-Bus总线守护进程提供的。它在Linux系统启动时运行,负责进程间的消息路由和传递,其中包括Linux内核和Linux桌面环境的消息传递。3. 包装层:包装层一系列基于特定应用程序框架的Wrapper库。D-bus 的重要概念元素:1. 对象:对象是封装后的匹配器与回调函数,它以对等(peer-to-peer)协议使每个消息都有一个源地址和一个目的地址。这些地址又称为对象路径,或者称之为总线名称。对象的接口是回调函数,它以类似C+的虚拟函数实现。当一个进程注册到某个总线时,都要创建相应的消息对象。2. 消息:D-Bus的消息分为信号(sig

5、nals)、方法调用(method calls)、方法返回(method returns)和错误(errors)。信号是最基本的消息,注册的进程可简单地发送信号到总线上,其他进程通过总线读取消息。方法调用是通过总线传递参数,执行另一个进程接口函数的机制,用于某个进程控制另一个进程。方法返回是注册的进程在收到相关信息后,自动做出反应的机制,由回调函数实现。错误是信号的一种,是注册进程错误处理机制之一。3. 服务:服务(Services)是进程注册的抽象。进程注册某个地址后,即可获得对应总线的服务。D-Bus提供了服务查询接口,进程可通过该接口查询某个服务是否存在。或者在服务结束时自动收到来自系统

6、的消息。System bus和session bus 在D-Bus中,“bus”是核心的概念,它是一个通道:不同的程序可以通过这个通道做些操作,比如方法调用、发送信号和监听特定的信号。在一台机器上总线守护有多个实例(instance)。这些总线之间都是相互独立的。l 一个持久的系统总线(system bus): 它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。 它是桌面会话和操作系统的通信,这里操作系统一般而言包括内核和系统守护进程。 这种通道的最常用的方面就是发送系统消息,比如:插入一个新的存储设备;有新的网络连接;等等。 l 还将有

7、很多会话总线(session buses): 这些总线当用户登录后启动,属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。 Bus daemon总线守护 Bus daemon是一个特殊的进程:这个进程可以从一个进程传递消息给另外一个进程。当然了,如果有很多applications链接到这个通道上,这个 daemon进程就会把消息转发给这些链接的所有程序。在最底层,D-Bus只支持点对点的通信,一般使用本地套接字(AF_UNIX)在应用和bus daemon之间通信。D-Bus的点对点是经过bus daemon抽象过的,由bus daemon来完成寻址和发送消息,因此每个应用不必要关心

8、要把消息发给哪个进程。D-Bus发送消息通常包含如下步骤(正常情况下):1. 创建和发送消息 给后台bus daemon进程,这个过程中会有两个上下文的切换 2. 后台bus daemon进程会处理该消息,并转发给目标进程,这也会引起上下文的切换 3. 目标程序接收到消息,然后根据消息的种类,做不同的响应:要么给个确认、要么应答、还有就是忽略它。最后一种情况对于“通知”类型的消息而言,前两种都会引起进一步的上 下文切换。 object path对于底层的D-Bus协议,即libdbus API,并不理会这些native object,它们使用的是一个叫做object path的概念。通过obj

9、ect path,高层编程可以为对象实例进行命名,并允许远程应用引用它们。这些名字看起来像是文件系统路径,例如一个对象可能叫做“/org/kde/kspread/sheets/3/cells/4/5”。 易读的路径名是受鼓励的做法,但也允许使用诸如“/com/mycompany/c5yo817y0c1y1c5b”等,只要它可以为你的应用程序所用。Namespacing的对象路径以开发者所有的域名开始(如 /org/kde)以避免系统不同代码模块互相干扰。*简单地说:一个应用创建对象实例进行D-Bus的通信,这些对象实例都有一个名字,命名方式类似于路径,例如/com/mycompany,这个名字

10、在全局(session或者system)是唯一的,用于消息的路由。方法和信号Methods and Signals 每一个对象有两类成员:方法和信号。方法就是JAVA中同样概念,方法是一段函数代码,带有输入和输出。信号是广播给所有兴趣的其他实体,信号可以带有数据payload。Tutorial这里说法有点不太清楚。在 D-BUS 中有四种类型的消息:方法调用(method calls)、方法返回(method returns)、信号(signals)和错误(errors)。要执行 D-BUS 对象的方法,您需要向对象发送一个方法调用消息。它将完成一些处理(就是执行了对象中的Method,Met

11、hod是可以带有输入参数的。)并返回,返回消息或者错误消息。信号的不同之处在于它们不返回任何内容:既没有“信号返回”消息,也没有任何类型的错误消息。接口Interface每一个对象支持一个或者多个接口,接口是一组方法和信号,接口定义一个对象实体的类型。D-Bus对接口的命名方式,类似org.freedesktop.Introspectable。开发人员通常将使用编程语言类的的名字作为接口名字。Bus Names总线名字 当一个应用连接到bus daemon,daemon立即会分配一个名字给这个连接,称为unique connection name ,这个唯一标识的名字以冒号:开头,例如:34-

12、907,这个名字在daemon的整个生命周期是唯一的。但是这种名字总是临时分配,无法确定的,也难以记忆,因此应用可以要求有另外一个名字well-known name 来对应这个唯一标识,就像我们使用域名来对应IP地址一样。例如可以使用com.mycompany来映射:34-907。应用程序可能会要求拥有额外的周知名字(well-known name ) 。例如,你可以写一个规范来定义一个名字叫做 com.mycompany.TextEditor。你的协议可以指定自己拥有这个名字,一个应用程序应该在路径/com/mycompany /TextFileManager下有一个支持接口org.free

13、desktop.FileHandler的对象。应用程序就可以发送消息到这个总线名字,对象,和接口以执行方法调用。当一个应用结束或者崩溃是,OS kernel会关闭它的总线连接。总线发送notification消息告诉其他应用,这个应用的名字已经失去他的owner。当检测到这类notification时,应用可以知道其他应用的生命周期。这种方式也可用于只有一个实例的应用,即不开启同样的两个应用的情况。地址 连接建立有server和client,对于bus daemon,应用就是client,daemon是server。一个D-Bus的地址是指server用于监听,client用于连接的地方,例如

14、unix:path=/tmp/abcedf标识server将在路径/tmp/abcedf的UNIX domain socket监听。地址可以是指定的TCP/IP socket或者其他在或者将在D-Bus协议中定义的传输方式。如果使用bus daemon,libdbus将通过读取环境变量自动获取session bus damon的地址,通过检查一个指定的UNIX domain socket路径获取system bus的地址。如果使用D-bus,但不是daemon,需要定义那个应用是server,那个是client,并定义一套机制是他们认可server的地址,这不是通常的做法。各种对象的关系Add

15、ress > Bus Name > Path > Interface > Method bus name不是必要的,它只在daemon的情况下用于路由,点对点的直接连接是不需要的。简单地说:Address是DBus中server用来监听client的地址,当一个client连接上D-Bus,通常是Daemo的方式,这个client就有了一个Bus Name。其他应用可以根据消息中所带的Bus Name,来判断和哪个应用相关。消息在总线中传递的时候,传递到应用中,再根据object path,送至应用中具体的对象实例中,也就是是应用中根据Interface创建的对象。这些

16、Interface有method和singal两种,用来发送、接收、响应消息。 Dbus消息类型:一、Method call消息:将触发对象的一个method 二、Method return消息:触发的方法返回的结果 三、Error消息:触发的方法返回一个异常 四、Signal消息:通知,可以看作为事件消息。消息的组成:一个消息有消息头header,里面有field,有一个消息体body,里面有参数arguments。消息头包含消息体的路由信息,消息体就是净荷payload。头字段可能包括发送者的bus名,目的地的bus名,方法或者signal名等等,其中一个头字段是用于描述body中的参数的

17、类型,例如“i”标识32位整数,"ii”表示净荷为2个32为整数。信号的发送:signal是个广播的消息,不需要响应,接收方向daemon注册匹配的条件,包括发送方和信号名,bus守护只将信号发送给希望接受的进程。处理流程如下:1. 一个signal消息发送到bus daemon。 2. signal消息包含发布该信号的interface名字,signal的名字,进程的bus名字,以及参数。 3. 任何进程都可以注册的匹配条件(match rules)表明它所感兴趣的signal。总线有个注册match rules列表。 4. bus daemon检查那些进程对该信号有兴趣,将信号消

18、息发送到这些进程中。 5. 收到信号的进程决定如何处理。如果使用高层的捆绑,一个porxy对象将会十分一个native的信号。如果使用底层的API,进程需要检查信号的发送发和信号的名字决定如果进行处理。D-bus使用流程:1. 建立服务的流程:建立一个dbus连接之后 - dbus_bus_get(),为这个dbus连接(DbusConnection)起名 - dbus_bus_request_name(),这个名字将会成为我们在后续进行远程调用的时候的服务名,然后我们进入监听循环 - dbus_connection_read_write()。在循环中,我们从总线上取出消息 - dbus_co

19、nnection_pop_message(),并通过比对消息中的方法接口名和方法名 - dbus_message_is_method_call(),如果一致,那么我们跳转到相应的处理中去。在相应的处理中,我们会从消息中取出远程调用的参数。并且建立起回传结果的通路 - reply_to_method_call()。回传动作本身等同于一次不需要等待结果的远程调用。2. 发送信号的流程:建立一个dbus连接之后,为这个dbus连接起名,建立一个发送信号的通道,注意,在建立通道的函数中,需要我们填写该信号的接口名和信号名 - dbus_message_new_signal()。然后我们把信号对应的相关

20、参数压进去 - dbus_message_iter_init_append(); dbus_message_iter_append_basic()。然后就可以启动发送了 - dbus_connection_send(); dbus_connection_flush。3. 进行一次远程调用的流程:建立好dbus连接之后,为这dbus连接命名,申请一个远程调用通道 -dbus_message_new_method_call(),注意,在申请远程调用通道的时候,需要填写服务器名,本次调用的接口名,和本次调用名(方法名)。压入本次调用的参数 - dbus_message_iter_init_appen

21、d(); dbus_message_iter_append_basic(),实际上是申请了一个首地址,我们就是把我们真正要传的参数,往这个首地址里面送(送完之后一般都会判断是否内存越界了)。然后就是启动发送调用并释放发送相关的消息结构 - dbus_connection_send_with_reply()。这个启动函数中带有一个句柄。我们马上会阻塞等待这个句柄给我们带回总线上回传的消息。当这个句柄回传消息之后,我们从消息结构中分离出参数。用dbus提供的函数提取参数的类型和参数 - dbus_message_iter_init(); dbus_message_iter_next(); dbus

22、_message_iter_get_arg_type(); dbus_message_iter_get_basic()。也就达成了我们进行本次远程调用的目的了。4. 信号接收流程:建立一个dbus连接之后,为这个dbus连接起名,为我们将要进行的消息循环添加匹配条件(就是通过信号名和信号接口名来进行匹配控制的) - dbus_bus_add_match()。我们进入等待循环后,只需要对信号名,信号接口名进行判断就可以分别处理各种信号了。在各个处理分支上。我们可以分离出消息中的参数。对参数类型进行判断和其他的处理。D-bus信号的处理流程:1. 当使用dbus底层接口时,信号需要应用自己创建和发

23、送到daemon。2. 信号包含的内容有:信号的接口名称,信号名称,发送进程的bus name,以及其他参数。3. 任何进程都可以依据”match rules”注册相关的信号,daemon有一张注册的列表。4. daemon检测信号,决定哪些进程对这个信号感兴趣,然后把信号发送给这些进程。5. 每个进程收到信号后需要检查发送者名称和信号名称,然后决定怎么做。D-bus数据类型的定义:信号收发例子:发送方:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dbus/dbus

24、-glib.h>#include <dbus/dbus.h>#include <unistd.h>int send_a_signal( char * sigvalue) DBusError err; DBusConnection * connection; DBusMessage * msg; DBusMessageIter arg; dbus_uint32_t serial = 0; int ret; /步骤1:建立与D-Bus后台的连接 dbus_error_init(&err); connection = dbus_bus_get(DBUS_BUS_

25、SESSION , &err ); if(dbus_error_is_set(&err) fprintf(stderr," Err : %sn",err.message); dbus_error_free(&err); if(connection = NULL) return -1; /步骤2:给连接名分配一个well-known的名字作为Bus name,这个步骤不是必须的,可以用if 0来注释着一段代码,我们可以用这个名字来检查,是否已经开启了这个应用的另外的进程。#if 1 ret = dbus_bus_request_name(connect

26、ion,"test.singal.source",DBUS_NAME_FLAG_REPLACE_EXISTING,&err ); if(dbus_error_is_set(&err) fprintf(stderr,"Name Err : %sn",err.message); dbus_error_free(&err); if(ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) return -1;#endif /步骤3:发送一个信号 if(msg = dbus_message_new_sig

27、nal ("/test/signal/Object","test.signal.Type","Test") = NULL) fprintf(stderr,"Message NULLn"); return -1; /给这个信号(messge)具体的内容 dbus_message_iter_init_append (msg,&arg); if(!dbus_message_iter_append_basic (&arg,DBUS_TYPE_STRING,&sigvalue) fprintf(std

28、err,"Out Of Memory!n"); return -1; /步骤4: 将信号从连接中发送 if( !dbus_connection_send (connection,msg,&serial) fprintf(stderr,"Out of Memory!n"); return -1; dbus_connection_flush (connection); printf("Signal Sendn"); /步骤5: 释放相关的分配的内存。 dbus_message_unref(msg ); return 0;int m

29、ain( int argc , char * argv) send_a_signal("Hello,world!"); return 0;接收方:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dbus/dbus-glib.h>#include <dbus/dbus.h>#include <unistd.h>void listen_signal() DBusMessage * msg; DBusMessageIter a

30、rg; DBusConnection * connection; DBusError err; int ret; char * sigvalue; /步骤1:建立与D-Bus后台的连接 dbus_error_init(&err); connection = dbus_bus_get(DBUS_BUS_SESSION, &err); if(dbus_error_is_set(&err) fprintf(stderr,"Connection Error %sn",err.message); dbus_error_free(&err); if(co

31、nnection = NULL) return; /步骤2:给连接名分配一个可记忆名字作为Bus name,这个步骤不是必须的,但推荐这样处理 ret = dbus_bus_request_name(connection,"test.singal.dest",DBUS_NAME_FLAG_REPLACE_EXISTING,&err); if(dbus_error_is_set(&err) fprintf(stderr,"Name Error %sn",err.message); dbus_error_free(&err); if(

32、ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) return; /步骤3:通知D-Bus daemon,希望监听来行接口的信号 dbus_bus_add_match(connection,"type='signal',interface='test.signal.Type'",&err); /实际需要发送东西给daemon来通知希望监听的内容,所以需要flush dbus_connection_flush(connection); if(dbus_error_is_set(&err)

33、 fprintf(stderr,"Match Error %sn",err.message); dbus_error_free(&err); /步骤4:在循环中监听,每隔开1秒,就去试图自己的连接中获取这个信号。这里给出的是中连接中获取任何消息的方式,所以获取后去检查一下这个消息是否我们期望的信号,并获取内容。我们也可以通过这个方式来获取method call消息。 while(1) dbus_connection_read_write(connection,0); msg = dbus_connection_pop_message (connection); if

34、(msg = NULL) sleep(1); continue; if(dbus_message_is_signal(msg,"test.signal.Type","Test") ) if(!dbus_message_iter_init(msg,&arg) ) fprintf(stderr,"Message Has no Param"); else if(dbus_message_iter_get_arg_type(&arg) != DBUS_TYPE_STRING) g_printerr("Param is

35、 not string"); else dbus_message_iter_get_basic(&arg,&sigvalue); printf("Got Singal with value : %sn",sigvalue); dbus_message_unref(msg); /End of whileint main( int argc , char * argv) listen_signal(); return 0;DBus相关重要函数的功能:int npd_dbus_init(void)/*定义错误结构体struct DBusError con

36、st char *name; /*<错误名*/ const char *message; /*< 错误消息*/ unsigned int dummy1 : 1; /*<占位 */ unsigned int dummy2 : 1; /*<占位*/ unsigned int dummy3 : 1; /*<占位*/ unsigned int dummy4 : 1; /*<占位*/ unsigned int dummy5 : 1; /*<占位*/ void *padding1; /*<占位*/;DBusError dbus_error;/*特定对象的消息

37、处理挂接处理函数表struct DBusObjectPathVTable DBusObjectPathUnregisterFunction unregister_function; /*<注销的功能函数 */ DBusObjectPathMessageFunction message_function; /*< 功能函数*/ void (* dbus_internal_pad1) (void *); /*< 保留扩展*/ void (* dbus_internal_pad2) (void *); /*<保留扩展*/ void (* dbus_internal_pad3)

38、 (void *); /*<保留扩展*/ void (* dbus_internal_pad4) (void *); /*<保留扩展*/;*/DBusObjectPathVTablenpd_vtable = NULL, &npd_dbus_message_handler, NULL, NULL, NULL, NULL;DBusObjectPathVTableports_vtable = NULL, &npd_dbus_ethports_message_handler, NULL, NULL, NULL, NULL;/*在创建新的连接时会设置SIGPIPE信号,如果为

39、TRUE进程在收到SIGPIPE信号后不会终止进程,如果为FALSE则使用系统默认的处理方式。原型:Voiddbus_connection_set_change_sigpipe (dbus_bool_t will_modify_sigpipe)*/dbus_connection_set_change_sigpipe (TRUE);/*初始化错误信息变量原型:Void dbus_error_init (DBusError *error)*/dbus_error_init (&dbus_error);/*在指定的总线上申请一个连接原型:DBusConnection * dbus_bus_g

40、et (DBusBusType type,DBusError *error)*/npd_dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &dbus_error);/*如果返回值为空则说明dbus_bus_get没有正常的运行,打印dbus_error中的错误信息*/if (npd_dbus_connection = NULL) syslog_ax_dbus_err ("dbus_bus_get(): %s", dbus_error.message);return FALSE;/*增加不同对象的方法处理函数返回值为FA

41、LSE则说明内存不够,或者其他的原因可以使用dbus_connection_try_register_object_path()检测,并可以返回错误信息。原型:dbus_bool_tdbus_connection_register_fallback (DBusConnection *connection,/连接名 const char *path,/需要注册的对象路径 const DBusObjectPathVTable *vtable,/函数数据结构 void *user_data/需要传送到虚表内的函数)在上面函数中相应path的子树结构体中的invoke_as_fallback字段被设置

42、为了TRUE,有于没有看到此字段调用的位置,所以这个字段的作用初步判断是处理这个路径上子树的消息dbus_bool_tdbus_connection_register_object_path (DBusConnection *connection, const char *path, const DBusObjectPathVTable *vtable, void *user_data)在上面函数中相应path的子树结构体中的invoke_as_fallback字段被设置为了FALSE,有于没有看到此字段调用的位置,所以这个字段的作用初步判断是不处理这个路径上子树的消息*/* Use npd

43、to handle subsection of NPD_DBUS_OBJPATH including slots*/if (!dbus_connection_register_fallback (npd_dbus_connection, NPD_DBUS_OBJPATH, &npd_vtable, NULL) syslog_ax_dbus_err("can't register D-BUS handlers (fallback NPD). cannot continue.");return FALSE; /* use port handler to hand

44、le exact port related functions.*/if (!dbus_connection_register_object_path (npd_dbus_connection, NPD_DBUS_ETHPORTS_OBJPATH, &ports_vtable, NULL) syslog_ax_dbus_err("can't register D-BUS handlers (obj PORTS). cannot continue.");return FALSE;/*为连接申请一个公共名原型:Intdbus_bus_request_name (

45、DBusConnection *connection, /申请的连接 const char *name,/需要申请的公共名 unsigned int flags, /标识 DBusError *error)*/dbus_bus_request_name (npd_dbus_connection, NPD_DBUS_BUSNAME, 0, &dbus_error);if (dbus_error_is_set (&dbus_error) syslog_ax_dbus_err ("dbus_bus_request_name(): %s", dbus_error.m

46、essage);return FALSE;dbus_connection_add_filter (npd_dbus_connection, npd_dbus_filter_function, NULL, NULL);/*向DBus-deamon指定想接收到什么样的消息,在这个函数内部的实现就是向org.freedesktop.DBus->/org/freedesktop/DBus->org.freedesktop.DBus->AddMatch方法发送匹配字符串。函数原型:voiddbus_bus_add_match (DBusConnection *connection,/申

47、请的到总线的链接 const char *rule,/需要收到的消息规则 DBusError *error/错误变量)*/dbus_bus_add_match (npd_dbus_connection, "type='signal'" ",interface='"DBUS_INTERFACE_DBUS"'" ",sender='"DBUS_SERVICE_DBUS"'" ",member='NameOwnerChanged'

48、;", NULL);return TRUE;/*/*dbus方法的调用/*unsigned int dcli_dhcp_snp_check_global_status(unsigned char* stats)/*定义需要发送的消息和接受的回传消息*/DBusMessage *query = NULL, *reply = NULL;DBusError err;unsigned char status = DCLI_DHCP_SNP_INIT_0;unsigned int ret = DHCP_SNP_RETURN_CODE_OK;/*将要发送的目的封装到消息的头部原型:DBusMes

49、sage*dbus_message_new_method_call (const char *destination,/目的BUS const char *path,/目的路径 const char *interface,/目的接口 const char *method/所调用的方法)*/query = dbus_message_new_method_call(NPD_DBUS_BUSNAME,NPD_DBUS_OBJPATH,NPD_DBUS_INTERFACE,NPD_DBUS_DHCP_SNP_METHOD_CHECK_GLOBAL_STATUS);dbus_error_init(&am

50、p;err);/*将封装好的消息发送到deamon,并阻塞等待对端返回应答消息,并且没有超时原型:DBusMessage*dbus_connection_send_with_reply_and_block (DBusConnection *connection,/ DBusMessage *message,封装好的消息 int timeout_milliseconds,/超时 DBusError *error/错误参数)*/reply = dbus_connection_send_with_reply_and_block(dcli_dbus_connection, query, -1, &am

51、p;err);dbus_message_unref(query);if (NULL = reply) printf("failed get args.n");if (dbus_error_is_set(&err) printf("%s raised: %s", , err.message);dbus_error_free(&err);dbus_message_unref(reply);return DHCP_SNP_RETURN_CODE_ERROR;/*取出返回的数据原型:dbus_bool_tdbus_message_

52、get_args (DBusMessage *message, DBusError *error, int first_arg_type, .)*/if (dbus_message_get_args(reply, &err,DBUS_TYPE_UINT32, &ret,DBUS_TYPE_BYTE, &status,DBUS_TYPE_INVALID) if (DHCP_SNP_RETURN_CODE_OK = ret) *stats = status;elseret = DHCP_SNP_RETURN_CODE_ERROR; else printf("Failed get args.n");if (dbus_error_is_set(&err) printf("%s rai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论