6
votes

Détecter le type de connexion réseau sous Linux

Comment puis-je détecter le type de connexion réseau, par exemple, qu'il soit câblé ou Wi-Fi, dans une application C ++ Linux?

Si l'appareil dispose de plusieurs interfaces réseau, je souhaite détecter le type de connexion de l'interface utilisée.

Merci.


3 commentaires

Utilisez iwconfig pour obtenir une liste de périphériques sans fil?


Merci. Cependant, je voudrais obtenir les informations dans une application C ++.


Maintenant, il y a un API DBUS pour NetworkManager pour faciliter considérablement la tâche.


4 Réponses :


0
votes

par l'interface utilisée, Eth ou WLAN.


2 commentaires

Les noms des interfaces peuvent être modifiés et ne refléteront pas nécessairement leur type. Tentative d'actions sans fil sur eux (E.G. IwList Scan ) pourrait être une meilleure approche - vérifier les capacités, pas les noms.


@CDHOWIE: Cela nécessite que l'utilisateur installe iwconfig de Wireless_Tools. Il serait préférable de trouver une solution sans dépendances. Vous pouvez affirmer que si vous utilisez un périphérique sans fil, vous avez besoin d'Iwconfig, mais ce n'est pas vrai: vous pouvez utiliser WPA_Supplicant, qui ne s'appuie pas sur Iwconfig pour travailler.



1
votes

Si l'interface est présente dans / proc / net / réseau / sans fil, il s'agit d'une interface sans fil. Sinon, ce n'est pas.


0 commentaires

1
votes

Merci pour toutes les intrants.

La solution que je monte:

  1. Obtenez toutes les interfaces actives 'noms et adresses IP de / proc / net / dev

  2. Obtenez l'interface actuelle en mappant l'adresse IP utilisée

  3. Vérifiez si l'interface actuelle est sans fil en consultant / proc / net / sans fil


0 commentaires

8
votes

Je cherche aussi cette réponse. J'ai trouvé un code de code intéressant dans OpenSUSE Gitorious . Apparemment, ils utilisent la pièce de code suivante pour obtenir le type d'interface:

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
}


2 commentaires

Ce sont des identifiants de type matériel ARP. Ils peuvent être trouvés dans if_arp.h .


C'est génial. Merci pour le conseil!