2010-12-17 33 views
4

如何在C++ Linux應用程序中檢測網絡連接類型,即它是有線還是WiFi?如果設備有多個網絡接口,我想檢測所用接口的連接類型。 謝謝,在Linux中檢測網絡連接類型

+0

使用iwconfig獲取無線設備列表? – Zoredache 2010-12-17 22:52:45

+0

謝謝。但是我想在C++應用程序中獲取信息。 – derekwei 2010-12-17 23:03:33

+0

現在有一個[用於NetworkManager的DBUS API](http://projects.gnome.org/NetworkManager/developers/api/09/)可以使這個更容易。 – 2013-04-17 14:07:26

回答

0

感謝您的所有投入。

的解決方案,我想出了:

  1. 得到所有活動接口從/proc/net/dev

  2. 名和IP地址的映射IP地址得到當前的接口使用

  3. 檢查是否目前的接口是無線通過查看/proc/net/wireless

0

通過使用的接口,eth或wlan。

+1

接口的名稱可能會更改,並不一定反映它們的類型。嘗試對它們進行無線操作(例如'iwlist scan')可能是更好的方法 - 檢查功能,而不是名稱。 – cdhowie 2010-12-17 22:50:17

+0

@cdhowie:這需要用戶從wireless_tools安裝iwconfig。找到沒有依賴關係的解決方案會更好。你可能會爭辯說,如果你使用無線設備,你需要iwconfig,但事實並非如此:你可以使用wpa_supplicant,它不依賴於iwconfig。 – user48678 2013-04-17 12:18:21

1

如果接口存在於/ proc/net/wireless中,則它是無線接口。否則,它不是。

4

我一直在尋找這個答案。我在opensuse gitorious中發現了一段有趣的代碼。很顯然,他們使用下面的代碼來獲取接口類型:

get_iface_type() { 
    local IF=$1 TYPE 
    test -n "$IF" || return 1 
    test -d /sys/class/net/$IF || return 2 
    case "`cat /sys/class/net/$IF/type`" in 
      1) 
       TYPE=eth 
       # Ethernet, may also be wireless, ... 
       if test -d /sys/class/net/$IF/wireless -o \ 
         -L /sys/class/net/$IF/phy80211 ; then 
        TYPE=wlan 
       elif test -d /sys/class/net/$IF/bridge ; then 
        TYPE=bridge 
       elif test -f /proc/net/vlan/$IF ; then 
        TYPE=vlan 
       elif test -d /sys/class/net/$IF/bonding ; then 
        TYPE=bond 
       elif test -f /sys/class/net/$IF/tun_flags ; then 
        TYPE=tap 
       elif test -d /sys/devices/virtual/net/$IF ; then 
        case $IF in 
         (dummy*) TYPE=dummy ;; 
        esac 
       fi 
       ;; 
      24) TYPE=eth ;; # firewire ;; # IEEE 1394 IPv4 - RFC 2734 
      32) # InfiniBand 
      if test -d /sys/class/net/$IF/bonding ; then 
       TYPE=bond 
      elif test -d /sys/class/net/$IF/create_child ; then 
       TYPE=ib 
      else 
       TYPE=ibchild 
      fi 
       ;; 
      512) TYPE=ppp ;; 
      768) TYPE=ipip ;; # IPIP tunnel 
      769) TYPE=ip6tnl ;; # IP6IP6 tunnel 
      772) TYPE=lo ;; 
      776) TYPE=sit ;; # sit0 device - IPv6-in-IPv4 
      778) TYPE=gre ;; # GRE over IP 
      783) TYPE=irda ;; # Linux-IrDA 
      801) TYPE=wlan_aux ;; 
     65534) TYPE=tun ;; 
    esac 
    # The following case statement still has to be replaced by something 
    # which does not rely on the interface names. 
    case $IF in 
     ippp*|isdn*) TYPE=isdn;; 
     mip6mnha*) TYPE=mip6mnha;; 
    esac 
    test -n "$TYPE" && echo $TYPE && return 0 
    return 3 
} 

我還是得找官方的文檔,以確認什麼/ SYS /班/ NET/$ IF /型手段的價值,但是這功能已經解釋了很多。

編輯:好吧,我已經讀了一些關於sysfs,並發現這是一個在屁股疼痛。我還沒有找到任何適當的文件。

如您所知,這些信息是從內核中提取出來的,以便在用戶空間中呈現。所以我最終在sysfs的源代碼和內核中尋找了解這個「type」屬性是什麼。我相信部分答案應該在net-sysfs.c以及linux/device.h中找到。我無法弄清楚這些東西是如何連接的。當我看到我需要了解所有這些宏時,我停下來......

+2

這些是ARP硬件類型ID。它們可以在[if_arp.h]中找到(http://lxr.free-electrons.com/source/include/uapi/linux/if_arp.h)。 – mpontillo 2015-10-20 04:25:49

+0

這太棒了。謝謝你的提示! – user48678 2015-10-21 07:52:37