Dbus 进程间通讯(三) 点对点模式

Posted by feizaipp on May 5, 2019

我的博客

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 */