2017-08-03 150 views
1

我是新進入進程間通信。我需要你的幫助和明確的解釋。我有2個應用程序。其中之一是一種服務,一種是客戶。我用QT/C++編寫它們。當他們在一臺本地PC上工作時 - 一切都很好。但我需要將它們分開。通過TCP連接到DBus服務

所以,我有一臺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在另一臺電腦上。 我連接使用下面的代碼我的客戶:

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。我不知道該怎麼做。我在論壇上發現了幾個主題,但我仍然不明白該怎麼做。

所以,我發現:

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

這不是成功的。 我不知道如何將它們連接到對方。 請問任何人,請告訴我它應該如何,它是如何工作的? 我想清楚地瞭解它是如何工作的?

我將非常感謝任何幫助。我希望你的好意。

UPDATE I have found how to connect my client to DBus bus via TCP:

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

  • 在客戶端我必須設置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"); 
    

    我試圖用任何隨機名稱進行連接,但是這是不正確的。 所以,我的問題是 - 我可以得到正確的連接名稱?

    +0

    HiЕлена)))[D-Bus聊天示例](http://doc.qt.io/qt-5/qtdbus-chat-example.html) –

    +0

    或[QtDbus](https:// habrahabr。 ru/post/185212 /)project ping pong) –

    +0

    對不起,我在這裏找不到有關TCP DBus通信的任何信息。這裏的客戶和服務都在同一臺個人電腦上工作,而且肯定會在一次公交會話中註冊。 –

    回答

    0

    正確回答我的問題是:

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

      然後開始應用,請複製打印的姓名,並把它在我的客戶。

    現在,它的工作原理!

    +0

    [通過DBus在不同(遠程)機器中進行交互處理](http://gabriel.sourceforge.net/howto .html) –

    +0

    [連接到不同計算機上的會話DBus](https://stackoverflow.com/questions/19137703/connect-to-session-dbus-on-different-computer) –