Ошибка при обращении к моему серверу gdbus без демона шины

#c #ipc #gnome #gdbus

#c #ipc #gnome #gdbus

Вопрос:

Я пытаюсь создать одноранговую связь gdbus в системе Linux. Я использовал инструмент 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", amp;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?

Комментарии:

1. Вы уверены, что на unix:path=/home/my_user_name/MySockets/some_socket запущен демон D-Bus? Судя по сообщению об ошибке, я подозреваю, что это не так.

2. Я открыл этот сокет из своего серверного приложения (так что это не отдельный демон dbus, но он напрямую подключает клиента к моему серверному приложению). Я предполагаю, что эта часть работает, поскольку функция printf внутри сервера «on_new_connection» фактически запускается.

Ответ №1:

Из того, что я понял из вашего вопроса и вашего комментария, похоже, что вы пытаетесь выполнить IPC D-Bus на необработанном сокете без какого-либо демона D-Bus, запущенного на этом пути. К сожалению, это так не работает, поскольку D-Bus действительно нуждается в каком-то запущенном брокере. Здесь у вас есть несколько вариантов:

  • Вместо того, чтобы использовать необработанный сокет, вы можете подключиться к сеансу или системной шине (оба должны быть доступны в обычном сеансе Linux)
  • Перед запуском вашего приложения вы запускаете демон D-Bus, который прослушивает сокет по указанному пути. Смотрите также dbus-daemon или D-Bus Broker для реализаций.
  • Вы продолжаете использовать необработанный сокет, после чего вы используете протокол, специфичный для конкретного приложения (который может быть основан на любом типе RPC).