2017-10-24 72 views
0

이 게시물에는 두 가지 질문이 있습니다. 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)에서 공유 링크에서, 아래 비슷한 라인을 교체 할 수 있습니다. 다음은 특정 장치에/다운 이벤트를 청취

코드는 그냥

  • /조직/freedesktop/NetworkManager는/디바이스/0
  • 에 객체 경로의 PARM 값을 변경 한/조직/freedesktop/네트워크 매니저/디바이스/1

    프록시 = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 플래그 NULL/* GDBusInt erfaceInfo / "org.freedesktop.NetworkManager" "/ 조직/freedesktop/네트워크 매니저/디바이스/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]); 

출력 (I 내 컴퓨터에서 2 개 NIC 카드가)

/조직/freedesktop/NetworkManager는/디바이스/0

/조직/freedesktop/네트워크 매니저/Devices/1

0

에 나는 d-feet 유틸리티를 조금 봤는데.

'시스템 버스'에는 /org/freedesktop/NetworkManagerDeviceAdded 신호가 있습니다.

/org/freedesktop/NetworkManager/Devices/1 가지가 있습니다

  • Interface 문자열 신호 org.freedesktop.NetworkManager.Device.Wired에서, org.freedesktop.NetworkManager.Device.Bridge, org.freedesktop.NetworkManager.Device.Adsl 부울
  • Carrierorg.freedesktop.NetworkManager.DevicePropertiesChanged ... 그래서

의 네트워크 매니저 객체를 가져 듣고 장치 목록을 수정하려면 현재 장치의 PropertiesChanged에 가입하십시오. 장치가 나타나면 Carrier 속성을 살펴보십시오.

인터페이스가 작동 중이지만 IP가 할당되지 않았거나 다른 중간 상태에 있다는 것을 감지하려면 다른 속성을 살펴보십시오.

당신이 우분투의 서버 버전을 사용하고 있다면 (그렇지 않다면) 나는 NetworkManager를 사용하지 않는다고 생각합니다. 따라서 다소 덜 사용 가능한 D-Bus 인터페이스 인 org.freedesktop.network1을 가지고 있습니다. DeviceAdded/DeviceRemoved의

셸 예 :

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

와이파이 USB 키에 연결되어있는 경우 :

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

여러 신호를 발사한다. 따라서 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

Velkan 고맙습니다. 이것은 많은 도움이됩니다. –

+0

나는 리눅스에서 초보자이며이를위한 코드 샘플을 얻는 데 어려움을 겪고있다. 내가 공유 한 코드 아래에서 인터페이스 위/아래 이벤트 변경 사항 중 하나를들을 수있었습니다. 그러나 위에서 언급 한 내용에 관심이 있습니다 (예 : 모든 기기 속성 변경 신호 수신). 이 샘플 코드를 공유해 주시겠습니까? –

+0

사용중인 D-Bus GLib 바인딩에서'g_dbus_connection_signal_subscribe()'함수가 가장 확실합니다. 나는 어떤 코드 예제도 즉시 볼 수 없다. 이 함수는 함수에 대한 포인터를 사용하므로 꽤 일반적인 C 스타일 콜백 설치 프로그램입니다. – Velkan