2010-12-17 5 views
4

어떻게 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 주소가

  3. 확인 여부 사용되는 IP 주소를 매핑하여 현재 인터페이스를 얻을 수 현재의 인터페이스는 무선으로보고있다. /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 수단의 값하지만,이 함수는 이미 많은 것을 설명합니다.

편집 : 좋아요, sysfs에 대해 조금 더 읽었습니다. 알아 내면 엉덩이에 통증이 있습니다. 나는 적절한 문서를 찾지 못했습니다.

이 정보는 사용자 공간에 표시되기 위해 커널에서 가져온 것입니다. 그래서 나는이 "type"속성이 무엇인지를 이해하기 위해 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

관련 문제