1

我正在编写一个服务于不同机器的服务器(用 C 语言)。我想用D-Bus通过Internet进行远程过程调用,但听说D-Bus不能多机使用,只能一台机器使用。是对的吗?我可以在这种情况下使用 D-Bus 吗?

4

3 回答 3

7

简短的回答是肯定的,这是可能的;dbus 可以在不同的机器上使用(但请参阅下面的安全警告)。

在您的服务器上,dbus-daemon 配置文件(您可能只想为您的服务设置一个完整的其他总线,而不是重用系统或会话总线)将需要配置为通过 TCP 接受连接,而不仅仅是通过本地套接字/tmp. 有一些技巧可以在 dbus-daemon中设置适当的侦听命令,这些技巧有据可查。

此外,如果您无法修改本地 dbus-daemon(或者您被迫使用随 RHEL 分发的旧的、损坏的 dbus-daemon 版本,它不会侦听远程套接字),您可以运行一个名为dbus-daemon的应用程序-proxy将侦听套接字并将连接转发到本地 dbus-daemon。

无论哪种方式,在您的客户端计算机上,您都需要设置DBUS_SESSION_BUS_ADDRESS变量以获取 dbus-daemon 或代理服务器正在侦听的 IP 地址和端口。

安全警告:线路上的数据没有加密,dbus 访问机制仅适用于本地连接,不适用于 TCP 连接。要正确保护使用 TCP 传输机制的 dbus 连接,您需要做一些工作。

于 2013-07-29T18:50:32.133 回答
1

即使您最终没有使用完整的 D-Bus 总线(dbus-daemon如仲裁器和拓扑。

这意味着您不必重新发明有线协议(包含所有潜在的解析器错误和漏洞利用),但可以在高级系统拓扑和传输上保留一些灵活性;例如,可能与单独的现有身份验证系统集成。

最简单的方法是使用GLib 中的GDBusMessageor API,使用or进行序列化。不要使用libdbus,因为它级别太低,并且使用过时的 API 设计,这些设计比 GLib 等更现代的 API 更难从 C 中正确使用。同样,不要使用 dbus-glib,因为它的设计也很笨拙和过时。GVariantg_dbus_message_to_blob()g_variant_get_data()

于 2017-07-05T10:43:29.850 回答
-1

我无法确定 dbus-daemon 的实现,但从有线协议的角度来看,可能有以下场景:

1)您希望机器 A 和 B 交换消息,并且它们都可以通过 tcp 连接到服务器 C 上的 dbus 总线守护进程。对于 C,它们只是由连接名称标识的“连接” - 作为结果org.freedesktop.DBus.Helloorg.freedesktop.DBus.RequestName- 参见“消息总线名称” '

2)机器A连接机器B,使用点对点(无消息总线)方式交换消息。

于 2013-03-04T05:55:31.250 回答