0

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 呼び出しを使用する必要がありますか?

4

1 に答える 1

0

あなたの質問とコメントから私が集めたものから、そのパスで D-Bus デーモンを実行せずに、生のソケットで D-Bus IPC を実行しようとしているようです。残念ながら、D-Bus はある種のブローカーを実行する必要があるため、そのようには機能しません。ここにはいくつかのオプションがあります。

  • raw ソケットを使用するのではなく、セッションまたはシステム バスに接続できます (どちらも通常の Linux セッションで使用できるはずです)。
  • アプリケーションを起動する前に、指定されたパスでソケットをリッスンする D-Bus デーモンを起動します。dbus-daemon実装については、または D-Bus Brokerも参照してください。
  • 生のソケットを使用し続け、その時点でアプリケーション固有のプロトコル (あらゆる種類の RPC に基づくことができます) を使用します。
于 2020-09-07T16:10:26.280 に答える