通过 TCP 连接到 DBus 服务
Connect to DBus service via TCP
我刚接触进程间通信。我需要你的帮助和明确的解释。我有 2 个应用程序。其中一个是服务,一个是客户端。我用 QT/C++ 来写它们。当他们在一台本地 PC 上工作时 - 一切都很好。但我需要将它们分开。
所以,我在 IP 为 192.30.82.101 的 PC 上有一个服务。
我使用下一个代码将它连接到总线:
QDBusConnection connection = QDBusConnection::sessionBus();
connection.registerObject("/my/service/MyService", mySvc);
connection.registerService("my.service.MyService");
我在另一台 PC 上也有一个客户端,IP 为 192.30.82.40。
我使用下一个代码连接我的客户端:
QDBusServiceWatcher serviceWatcher = new QDBusServiceWatcher();
serviceWatcher->setConnection(QDBusConnection::sessionBus());
serviceWatcher->addWatchedService("my.service.MyService");
.....
myServiceProxy = new local::MyService("my.service.MyService",
"/my/service/MyService", QDBusConnection::sessionBus(), this);
我需要将 IP 为 192.30.82.40 的 PC 上的客户端连接到 PC 192.30.82.101 上的服务。我不知道该怎么做。我在论坛上找到了一些主题,但我仍然不明白该怎么做。
所以,我发现了什么:
- 在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf:
添加额外的行
<listen>tcp:host=<host>,port=<port></listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
这里我有一个问题:我必须在这里使用哪个IP地址(服务器或客户端)?哪个端口用于 DBUS(它是默认端口还是我如何检查它)?我尝试设置客户端 PC、服务 PC 和不同端口以及端口 0 的 IP 地址,但出现错误:无法绑定套接字“172.30.82.40:0”:无法分配请求的地址。
- 在客户端,我必须使用相同的地址设置 DBUS_SESSION_BUS_ADDRESS:
export DBUS_SESSION_BUS_ADDRESS=tcp:host=<host>,port=<port>
。
我尝试使用不同的端口来执行此操作,使用 0 个端口,因为这意味着 - 使用任何空闲端口。但是我无法使用任何端口+IP 配置启动总线守护进程。
我还尝试使用下一个代码将客户端 QDBusServiceWatcher 连接到总线:
serviceWatcher->setConnection(QDBusConnection::connectToBus("tcp:host=<host>,port=<port>", "session"));
没有成功。
我不知道如何将它们相互连接。
任何人都可以向我解释它应该如何,它是如何工作的?
我想清楚地了解它是如何工作的?
如有任何帮助,我将不胜感激。希望大家多多关照。
UPDATE
I have found how to connect my client to DBus bus via TCP:
- 在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf:
添加额外的行
<listen>tcp:host=localhost,bind=*,port=6667,family=ipv4</listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
这里要加上PORT。我们可以在 dbus 配置文件中找到它。
- 在客户端,我必须设置 DBUS_SESSION_BUS_ADDRESS 相应的地址(服务所在的 PC 的 IP):
export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4
.
就是这样。我们可以查看一下刚启动的dbus-monitor.
But now I have another issue: how to connect my client to my service?
I need to do something more to connect to my service.
I guess that this is something like:
QDBusConnection::connectToBus("tcp:host=<host>,port=<port>","connectionName");
我试过使用任何随机名称进行连接,但这是不正确的。
所以,我的问题是 - 在哪里可以获得正确的连接名称?
我的问题的正确答案是:
在有一个应用程序的 PC 上添加额外的行
/etc/dbus-1/session.conf:
<listen>tcp:host=localhost,bind=*,port=6667,family=ipv4</listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
您可以在 dbus 配置文件中找到正确的端口。
客户端需要设置DBUS_SESSION_BUS_ADDRESS
对应地址(服务所在PC的IP):
export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4
.
要连接到您的远程应用程序处于活动状态的会话,请使用下一个
连接字符串:
DBusConnection::connectToBus("tcp:host=192.50.88.10,port=6667", "qt_default_session_bus"));
如何知道会话名称?我在我的服务中添加了登录:
qDebug() << "Connection name: " << connection.name();
然后启动应用程序,复制打印名称并在我的客户端中设置。
现在可以使用了!
我刚接触进程间通信。我需要你的帮助和明确的解释。我有 2 个应用程序。其中一个是服务,一个是客户端。我用 QT/C++ 来写它们。当他们在一台本地 PC 上工作时 - 一切都很好。但我需要将它们分开。
所以,我在 IP 为 192.30.82.101 的 PC 上有一个服务。 我使用下一个代码将它连接到总线:
QDBusConnection connection = QDBusConnection::sessionBus();
connection.registerObject("/my/service/MyService", mySvc);
connection.registerService("my.service.MyService");
我在另一台 PC 上也有一个客户端,IP 为 192.30.82.40。 我使用下一个代码连接我的客户端:
QDBusServiceWatcher serviceWatcher = new QDBusServiceWatcher();
serviceWatcher->setConnection(QDBusConnection::sessionBus());
serviceWatcher->addWatchedService("my.service.MyService");
.....
myServiceProxy = new local::MyService("my.service.MyService",
"/my/service/MyService", QDBusConnection::sessionBus(), this);
我需要将 IP 为 192.30.82.40 的 PC 上的客户端连接到 PC 192.30.82.101 上的服务。我不知道该怎么做。我在论坛上找到了一些主题,但我仍然不明白该怎么做。
所以,我发现了什么:
- 在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf: 添加额外的行
<listen>tcp:host=<host>,port=<port></listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
这里我有一个问题:我必须在这里使用哪个IP地址(服务器或客户端)?哪个端口用于 DBUS(它是默认端口还是我如何检查它)?我尝试设置客户端 PC、服务 PC 和不同端口以及端口 0 的 IP 地址,但出现错误:无法绑定套接字“172.30.82.40:0”:无法分配请求的地址。
- 在客户端,我必须使用相同的地址设置 DBUS_SESSION_BUS_ADDRESS:
export DBUS_SESSION_BUS_ADDRESS=tcp:host=<host>,port=<port>
。
我尝试使用不同的端口来执行此操作,使用 0 个端口,因为这意味着 - 使用任何空闲端口。但是我无法使用任何端口+IP 配置启动总线守护进程。
我还尝试使用下一个代码将客户端 QDBusServiceWatcher 连接到总线:
serviceWatcher->setConnection(QDBusConnection::connectToBus("tcp:host=<host>,port=<port>", "session"));
没有成功。 我不知道如何将它们相互连接。 任何人都可以向我解释它应该如何,它是如何工作的? 我想清楚地了解它是如何工作的?
如有任何帮助,我将不胜感激。希望大家多多关照。
UPDATE I have found how to connect my client to DBus bus via TCP:
- 在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf: 添加额外的行
<listen>tcp:host=localhost,bind=*,port=6667,family=ipv4</listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
这里要加上PORT。我们可以在 dbus 配置文件中找到它。
- 在客户端,我必须设置 DBUS_SESSION_BUS_ADDRESS 相应的地址(服务所在的 PC 的 IP):
export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4
.
就是这样。我们可以查看一下刚启动的dbus-monitor.
But now I have another issue: how to connect my client to my service? I need to do something more to connect to my service. I guess that this is something like:
QDBusConnection::connectToBus("tcp:host=<host>,port=<port>","connectionName");
我试过使用任何随机名称进行连接,但这是不正确的。 所以,我的问题是 - 在哪里可以获得正确的连接名称?
我的问题的正确答案是:
在有一个应用程序的 PC 上添加额外的行 /etc/dbus-1/session.conf:
<listen>tcp:host=localhost,bind=*,port=6667,family=ipv4</listen>
<listen>unix:tmpdir=/tmp</listen>
<auth>ANONYMOUS</auth>
<allow_anonymous/>
您可以在 dbus 配置文件中找到正确的端口。
客户端需要设置DBUS_SESSION_BUS_ADDRESS 对应地址(服务所在PC的IP):
export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4
.要连接到您的远程应用程序处于活动状态的会话,请使用下一个 连接字符串:
DBusConnection::connectToBus("tcp:host=192.50.88.10,port=6667", "qt_default_session_bus"));
如何知道会话名称?我在我的服务中添加了登录:
qDebug() << "Connection name: " << connection.name();
然后启动应用程序,复制打印名称并在我的客户端中设置。
现在可以使用了!