2010-12-17 18 views
4

どのようにネットワーク接続の種類、つまり有線か無線LANかをC++ Linuxアプリケーションで検出できますか?デバイスに複数のネットワークインターフェイスがある場合は、使用するインターフェイスの接続タイプを検出したいと考えています。 ありがとう、Linuxでネットワーク接続の種類を検出します。

+0

iwconfigを使って無線デバイスのリストを取得する? – Zoredache

+0

ありがとうございます。しかし、私はC++アプリケーションで情報を取得したいと思います。 – derekwei

+0

これを簡単に行うために[NetworkManager用のDBUS API](http://projects.gnome.org/NetworkManager/developers/api/09/)があります。 –

答えて

0

すべての入力をありがとう。

私が思い付くソリューション:

  1. /proc/net/dev

  2. からすべてのアクティブインターフェイスの名前とIPアドレスを取得したIPアドレスをマッピングすることで、現在のインターフェイスを取得するかどうかを

  3. チェックを使用現在のインターフェイスは、見て無線です。/proc/net/wireless

0

使用されているインターフェイスで、ethまたはwlan。

+1

インターフェイスの名前は変更される可能性があり、必ずしもそのタイプを反映しているとは限りません。ワイヤレスアクションを試すこと(例: 'iwlist scan')はより良いアプローチかもしれません - 名前ではなく機能をチェックしてください。 – cdhowie

+0

@cdhowie:これにより、ユーザはwireless_toolsからiwconfigをインストールする必要があります。依存関係のないソリューションを見つける方が良いでしょう。ワイヤレスデバイスを使用する場合、iwconfigが必要だと主張することはできますが、それは真実ではありません:iwconfigに依存しないwpa_supplicantを使用することができます。 – user48678

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 /クラス/ネット/ $型手段/ IFが、これを確認するために、公式ドキュメントを見つけなければなりません関数はすでに多く説明しています。

EDIT:ok、私はもう少しsysfsについて読んだことがありますが、そのことはお尻の痛みです。私は適切な文書が見つかりませんでした。

この情報は、ユーザスペースに表示されるようにカーネルから引き出されています。だから私はsysfsとカーネルのソースを調べて、この "タイプ"属性が何であるかを理解しました。答えの一部は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

+0

これは素晴らしいです。ヒントをありがとう! – user48678

関連する問題