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? P>
Si l'appareil dispose de plusieurs interfaces réseau, je souhaite détecter le type de connexion de l'interface utilisée. P>
Merci. P>
4 Réponses :
par l'interface utilisée, Eth ou WLAN. P>
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 code>) 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.
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. P>
Merci pour toutes les intrants. p>
La solution que je monte: p>
Obtenez toutes les interfaces actives 'noms et adresses IP de Obtenez l'interface actuelle en mappant l'adresse IP utilisée p> li>
Vérifiez si l'interface actuelle est sans fil en consultant / proc / net / dev code> p> li>
/ proc / net / sans fil code> p> li>
ol>
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
}
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!
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.