2017-10-24 5 views
0

この投稿には2つの質問があります。 1.特定のネットワークデバイスのネットワークインターフェイスのアップ/ダウン通知 2.ネットワークデバイスを一覧表示します。Ubuntuのインターフェイス名を使用してネットワークインターフェイスのアップ/ダウン通知を受信するためのC++ライブラリ

私が提供する回答については下記を参照してください。 (Velkanのおかげでに到着しました)

私は、Ubuntuマシン上でインターフェース名up/downイベント通知を受け取るC++ライブラリを探しています。私は同僚のためにdbusインターフェイスを使用するように頼まれました。下のリンクを同じものに使用しました。インターフェイス名なしのインターフェイスのアップ/ダウンイベントだけを通知します。

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/C/glib/monitor-nm-state-gdbus.c

私はかなりいつか今、私は右の例を見つけることができなかったとさえdbusの文書がまっすぐ進むかどうか、私が探していますどのような情報を提供していないために周りグーグルいます。

これについての助けがあれば、大きな助けになります。

おかげでアドバンス

答えて

0

誰でも、質問(https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/C/glib/monitor-nm-state-gdbus.c)で、共有リンクで、下記のような行を置き換えることができます。 ここでは、特定のデバイス上/下イベントを聴くための

コードスニペットは、私はちょうど

  • /ORG/freedesktop/NetworkManagerを/デバイス/ 0
  • にオブジェクトパスのPARM値を変更しました/ ORG/freedesktop/NetworkManagerの/デバイス/ 1

    プロキシ= g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM、 フラグ、 NULL、/ * GDBusInt erfaceInfo / "org.freedesktop.NetworkManager"、 "/ ORG/freedesktop/NetworkManagerを/デバイス/ 1" 、 "org.freedesktop.NetworkManager.Device"、 NULL、/ GCancellable */ &エラー);

利用可能なデバイスを一覧表示するためのコードスニペット。ネットワークデバイスのリストについては、

proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
             flags, 
             NULL, /* GDBusInterfaceInfo */ 
             "org.freedesktop.NetworkManager", 
             "/org/freedesktop/NetworkManager", 
             "org.freedesktop.NetworkManager", 
             NULL, /* GCancellable */ 
             &error); 

ret = g_dbus_proxy_call_sync (proxy, 
           "GetDevices", 
           NULL, 
           G_DBUS_CALL_FLAGS_NONE, -1, 
           NULL, &error); 
if (!ret) { 
    g_dbus_error_strip_remote_error (error); 
    g_print ("ListConnections failed: %s\n", error->message); 
    g_error_free (error); 
    return; 
} 

g_variant_get (ret, "(^ao)", &paths); 
g_variant_unref (ret); 

for (i = 0; paths[i]; i++) 
    g_print ("%s\n", paths[i]); 

出力(私は私のマシンで2枚のNICカードを持っている)

/ORG/freedesktop/NetworkManagerを/デバイス/ 0

/ORG/freedesktop/NetworkManagerの/ Devices/1

0

に私はd-feetユーティリティを使用してビットを見てきました。

「システムバス」には/org/freedesktop/NetworkManagerにはDeviceAdded信号があります。

/org/freedesktop/NetworkManager/Devices/1のものがあります。

  • Interface弦信号org.freedesktop.NetworkManager.Device.Wiredで、org.freedesktop.NetworkManager.Device.Bridgeorg.freedesktop.NetworkManager.Device.Adslブール
  • Carrierorg.freedesktop.NetworkManager.Deviceにし、PropertiesChanged ...だから

、NetworkManagerのオブジェクトを取得し、聞きますデバイスリストの変更には、現在のデバイスのPropertiesChangedに申し込んでください表示されるデバイスと、Carrierプロパティを監視します。

インターフェイスが起動しているが、IPが割り当てられていない(または他の中間状態になっている)可能性があることを検出する場合は、他のプロパティを調べます。

サーバ版のUbuntuを使用している場合は、NetworkManagerを使用していないと思われます。そのため、D-Busインターフェイスの使用率は若干低くなります(org.freedesktop.network1)。

DeviceAdded/DeviceRemovedのシェルの例:いくつかの信号が発射される

signal time=1509615532.227067 sender=:1.8 -> destination=(null destination) serial=2051 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=DeviceAdded 
    object path "/org/freedesktop/NetworkManager/Devices/10" 
signal time=1509615532.228150 sender=:1.8 -> destination=(null destination) serial=2056 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged 
    array [ 
     dict entry(
     string "AllDevices" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/Devices/0" 
       object path "/org/freedesktop/NetworkManager/Devices/1" 
       object path "/org/freedesktop/NetworkManager/Devices/2" 
       object path "/org/freedesktop/NetworkManager/Devices/3" 
       object path "/org/freedesktop/NetworkManager/Devices/4" 
       object path "/org/freedesktop/NetworkManager/Devices/5" 
       object path "/org/freedesktop/NetworkManager/Devices/6" 
       object path "/org/freedesktop/NetworkManager/Devices/8" 
       object path "/org/freedesktop/NetworkManager/Devices/10" 
      ] 
    ) 
     dict entry(
     string "Devices" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/Devices/0" 
       object path "/org/freedesktop/NetworkManager/Devices/1" 
       object path "/org/freedesktop/NetworkManager/Devices/2" 
       object path "/org/freedesktop/NetworkManager/Devices/3" 
       object path "/org/freedesktop/NetworkManager/Devices/4" 
       object path "/org/freedesktop/NetworkManager/Devices/5" 
       object path "/org/freedesktop/NetworkManager/Devices/6" 
       object path "/org/freedesktop/NetworkManager/Devices/8" 
       object path "/org/freedesktop/NetworkManager/Devices/10" 
      ] 
    ) 
    ] 
signal time=1509615533.253596 sender=:1.8 -> destination=(null destination) serial=2072 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged 
    array [ 
     dict entry(
     string "WirelessEnabled" 
     variant    boolean false 
    ) 
    ] 
signal time=1509615533.287235 sender=:1.8 -> destination=(null destination) serial=2080 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged 
    array [ 
     dict entry(
     string "ActiveConnections" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/3" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/2" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/1" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/0" 
      ] 
    ) 
    ] 

$ dbus-monitor --system "type='signal',interface='org.freedesktop.NetworkManager'" 

にのWi-Fi USBキーが差し込まれています。したがって、DeviceAddedまたはPropertiesChangedに登録していれば、デバイス#10も監視する必要があることがわかります。

それが削除されます:

signal time=1509615612.892305 sender=:1.8 -> destination=(null destination) serial=2086 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=DeviceRemoved 
    object path "/org/freedesktop/NetworkManager/Devices/10" 
signal time=1509615612.893697 sender=:1.8 -> destination=(null destination) serial=2089 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged 
    array [ 
     dict entry(
     string "ActiveConnections" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/3" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/2" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/1" 
       object path "/org/freedesktop/NetworkManager/ActiveConnection/0" 
      ] 
    ) 
     dict entry(
     string "AllDevices" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/Devices/0" 
       object path "/org/freedesktop/NetworkManager/Devices/1" 
       object path "/org/freedesktop/NetworkManager/Devices/2" 
       object path "/org/freedesktop/NetworkManager/Devices/3" 
       object path "/org/freedesktop/NetworkManager/Devices/4" 
       object path "/org/freedesktop/NetworkManager/Devices/5" 
       object path "/org/freedesktop/NetworkManager/Devices/6" 
       object path "/org/freedesktop/NetworkManager/Devices/8" 
      ] 
    ) 
     dict entry(
     string "Devices" 
     variant    array [ 
       object path "/org/freedesktop/NetworkManager/Devices/0" 
       object path "/org/freedesktop/NetworkManager/Devices/1" 
       object path "/org/freedesktop/NetworkManager/Devices/2" 
       object path "/org/freedesktop/NetworkManager/Devices/3" 
       object path "/org/freedesktop/NetworkManager/Devices/4" 
       object path "/org/freedesktop/NetworkManager/Devices/5" 
       object path "/org/freedesktop/NetworkManager/Devices/6" 
       object path "/org/freedesktop/NetworkManager/Devices/8" 
      ] 
    ) 
    ] 
signal time=1509615612.910829 sender=:1.8 -> destination=(null destination) serial=2095 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged 
    array [ 
     dict entry(
     string "WirelessEnabled" 
     variant    boolean true 
    ) 
    ] 

同じ信号:#10が消えてしまいました。

またはそれらだけを取得することがDeviceAddedDeviceRemovedを購読する:作業コードサンプルを望んでいる

$ dbus-monitor --system type=signal,interface=org.freedesktop.NetworkManager,member=Device{Added,Removed} 
+0

ありがとうございました。これは大いに役立ちます。 –

+0

私はLinuxの初心者で、このためのコードサンプルを入手するのが難しいと感じています。私は、下のコードから私が共有しているインターフェイスのアップ/ダウンイベントの変更を聞くことができました。しかし、私はあなたが上記で言及したものに興味を持っています(つまり、すべてのデバイスのプロパティが変更されたシグナルを聞きます)。これに利用できるサンプルコードを私に教えてください。 –

+0

あなたが使用しているD-Bus GLibバインディングでは、 'g_dbus_connection_signal_subscribe()'関数が最も確実です。私はすぐにコード例を見ることができません。この関数は関数へのポインタを取るので、かなり普通のCスタイルのコールバックインストーラです。 – Velkan

関連する問題