#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).