首页 > 解决方案 > 在没有总线守护程序的情况下联系我的 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

这里发生了什么?在创建点对点服务器时实际上是否可以使用生成的骨架函数,还是必须使用 g_dbus_connection_register_object 等较低级别的 API 调用?

标签: cipcgnomegdbus

解决方案


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

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

推荐阅读