1. 概述
DBus 点对点通讯模式不需要 DBus Daemon 转发消息,客户端的消息直接通过 socket 发送给服务端,这种用法比较少见。源码我已上传到 github 。
2. 准备工作
准备工作同Dbus 进程间通讯(二) 总线模式 。
3. 服务端实现
首先生成 guid ;
然后创建 GDBusServer 对象,由于点对点模式不通过 DBus Daemon 转发消息,所以创建 GDBusServer 对象时要指定通讯地址;
创建 GDBusServer 对象后,启动 GDBusServer 服务;
启动服务后,注册客户端连接成功的处理函数。该函数的实现与 on_bus_acquired 一样;
最后事服务端进程进入 loop 循环;
代码如下所示:
guid = g_dbus_generate_guid ();
server_flags = G_DBUS_SERVER_FLAGS_NONE;
server = g_dbus_server_new_sync ("unix:path=/tmp/gdbusp2p", /* address */
server_flags, /* flags */
guid, /* guid */
NULL, /* GDBusAuthObserver */
NULL, /* GCancellable */
&error);
g_dbus_server_start (server);
g_signal_connect (server,
"new-connection",
G_CALLBACK (on_new_connection),
NULL);
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
4. 客户端实现
首先客户端连接服务端,由于点对点模式不通过 DBus Daemon 转发消息,所以连接时要指定通讯地址;
然后调用服务端的方法, 代码如下说示:
connection = g_dbus_connection_new_for_address_sync ("unix:path=/tmp/gdbusp2p",
G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
NULL, /* GDBusAuthObserver */
NULL, /* GCancellable */
&error);
value = g_dbus_connection_call_sync (connection,
"org.freedesktop.Gdbusp2p", /* bus_name */
"/org/freedesktop/Gdbusp2p/Base", /* object path */
"org.freedesktop.Gdbusp2p.Base", /* interface name */
"TestInt", /* method name */
NULL, /* parameters */
G_VARIANT_TYPE ("(i)"), /* reply type */
G_DBUS_CALL_FLAGS_NONE, /* flag */
-1, /* timeout msec */
NULL, /* cancellable */
&error); /* error */