通过TCP连接到DBus服务

欧琳娜·丽兹娜

我是进程间通信的新手。我需要您的帮助和明确的解释。我有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");

另外,我在另一台IP 192.30.82.40的PC上有一个客户端。我使用以下代码连接客户端:

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);

我需要将PC上具有IP 192.30.82.40的客户端连接到PC 192.30.82.101上的服务。我不知道该怎么做。我在论坛上找到了一些主题,但是我仍然不知道该怎么办。

所以,我发现了:

  1. 在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”:无法分配请求的地址。

  1. 在客户端,我必须使用相同的地址设置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"));

没有成功。我不知道如何将它们彼此连接。有人可以请我解释一下它应该如何运作吗?我想清楚地了解它是如何工作的?

我将非常感谢您的帮助。希望您的好意。

更新我发现了如何通过TCP将客户端连接到DBus总线:

  1. 在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配置文件中找到它。

  1. 在客户端,我必须设置DBUS_SESSION_BUS_ADDRESS与相应的地址(PC的IP哪里是服务)export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4

就这样。我们可以检查一下刚刚启动的dbus-monitor。

但是现在我还有另一个问题:如何将客户连接到我的服务?我需要做更多的事情才能连接到我的服务。我想这就像:

QDBusConnection::connectToBus("tcp:host=<host>,port=<port>","connectionName");

我尝试使用任何随机名称进行连接,但这是不正确的。所以,我的问题是-在哪里可以获得正确的连接名称?

欧琳娜·丽兹娜

我的问题的正确答案是:

  1. 在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配置文件中找到正确的端口。

  2. 在客户端上,需要用相应的地址(正在服务的PC的IP)设置DBUS_SESSION_BUS_ADDRESS
    export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4

  3. 要连接到远程应用程序仍处于活动状态的会话,请使用下一个连接字符串:

    DBusConnection::connectToBus("tcp:host=192.50.88.10,port=6667", "qt_default_session_bus")); 
    

    如何知道会话名称?我已在服务中添加日志:

    qDebug() << "Connection name: " << connection.name(); 
    

    然后启动应用程序,复制打印的名称并将其设置在我的客户端中。

现在可以了!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章