在没有总线守护程序的情况下联系我的gdbus服务器时出错

问题描述

我正在尝试在Linux系统上创建对等gdbus通信。我使用gdbus-codegen工具生成了可用于创建服务器的代码。我的服务器程序使用生成的框架函数实例化一个对象,然后通过g_dbus_interface_skeleton_export函数将其导出。这是服务器功能的概述,当服务器收到新连接时会调用功能

static gboolean on_new_connection(GDBusServer *server,GDBusConnection *connection,gpointer user_data)
{
    GError *error = NULL;
    printf("Got a new connection!\n");

    my_object = org_some_object_skeleton_new();
    g_signal_connect(my_object,"handle-get-magic-number",G_CALLBACK(my_callback_function),NULL);
    if(!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELetoN(my_object),connection,"/some/path",&error))

    return TRUE;
}

编译并启动服务器后,我尝试使用gdbus工具与其联系:

gdbus call --address=unix:path=/home/my_user_name/MySockets/some_socket --object-path=/some/path --method=org.some.object.get_magic_number

但是,我得到以下答复:

Error connecting: GDBus.Error:org.freedesktop.DBus.Error.UnkNownMethod: No such interface “org.freedesktop.DBus” on object at path /org/freedesktop/DBus

这是怎么回事?创建对等服务器时,实际上是否可以使用生成的框架函数,还是必须使用较低级别的API调用(例如g_dbus_connection_register_object)?

解决方法

从我从您的问题和评论中收集的信息来看,似乎您正在尝试在原始套接字上执行D-Bus IPC,而该路径上未运行任何D-Bus守护程序。不幸的是,它不能那样工作,因为D-Bus确实需要某种代理运行。您在这里有一些选择:

  • 您可以使用会话或系统总线连接(而不是使用原始套接字)(两者都应在正常的Linux会话中可用)
  • 在启动应用程序之前,您将启动一个D-Bus守护程序,该守护程序在提供的路径上侦听套接字。另请参见dbus-daemon或D-Bus Broker了解实施方案。
  • 继续使用原始套接字,这时将使用特定于应用程序的协议(可以基于任何种类的RPC)。