通过TCP

时间:2017-08-03 12:47:35

标签: c++ qt dbus

我是处理进程间通信的新手。我需要你的帮助和明确的解释。我有2个申请。其中一个是服务,一个是客户。我用QT / C ++来编写它们。当他们在一台本地PC上工作时 - 一切都很好。但我需要将它们分开。

所以,我在PC上有一个服务,IP为192.30.82.101。 我使用下一个代码将它连接到总线:

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

我需要将PC上的客户端IP 192.30.82.40连接到PC 192.30.82.101上的服务。我不知道该怎么做。我在论坛上发现了一些话题,但我仍然不明白该怎么做。

所以,我发现了:

  1. 在PC上我的服务我必须在/etc/dbus-1/session.conf中添加额外的行:
  2. <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”:无法分配请求的地址。< / p>

    1. 在客户端,我必须使用相同的地址设置DBUS_SESSION_BUS_ADDRESS:export DBUS_SESSION_BUS_ADDRESS=tcp:host=<host>,port=<port>
    2. 我尝试使用不同的端口,使用0端口执行此操作,因为这意味着 - 使用任何空闲端口。但我无法使用任何端口+ IP配置启动总线守护程序。

      此外,我尝试使用下一个代码将客户端QDBusServiceWatcher连接到总线:

      serviceWatcher->setConnection(QDBusConnection::connectToBus("tcp:host=<host>,port=<port>", "session"));
      

      没有成功。 我不知道如何将它们相互连接。 请问任何人,请解释一下它应该如何,它是如何工作的? 我想清楚地了解它是如何工作的?

      我将非常感谢任何帮助。我希望你的善意。

        

      更新   我已经找到了如何通过TCP将我的客户端连接到DBus总线:

      1. 在PC上我的服务我必须在/etc/dbus-1/session.conf中添加额外的行:
      2. <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
        2. 多数民众赞成。我们可以检查它刚启动dbus-monitor。

            

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

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

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

1 个答案:

答案 0 :(得分:2)

我的问题的正确答案是:

  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. 在客户端,需要设置DBUS_SESSION_BUS_ADDRESS 相应的地址(服务的PC的IP):
    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(); 
    

    然后启动app,复制打印的名称并将其设置在我的客户端。

  4. 现在有效!