(C, Linux) Savoir si une interface réseau est sans fil ou câblée

J’ai un programme qui comporte deux sections distinctes: l’une doit être exécutée lorsque l’interface réseau est un réseau local sans fil et l’autre, lorsqu’il s’agit d’une connexion LAN câblée. Comment puis-je savoir cela dans mon programme? Quelle fonction dois-je utiliser pour obtenir cette information?

Vous pouvez utiliser la commande iwconfig à partir de la ligne de commande:

$ iwconfig lo no wireless extensions. eth0 no wireless extensions. 

Si vous devez l’utiliser depuis C, comme l’explique le lien de @opaque ci-dessus, récupérez les sources ou utilisez strace pour voir quels ioctls () vous devez utiliser:

 ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported) ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0 write(2, "lo no wireless extensions"..., 35lo no wireless extensions. ) = 35 ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported) ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 write(2, "eth0 no wireless extensions"..., 35eth0 no wireless extensions. ) = 35 

Voir utilisation de SIOCGIWNAME :

 #define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ /* SIOCGIWNAME is used to verify the presence of Wireless Extensions. * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... 

Si le nom de votre appareil est NETDEVICE , une vérification de l’existence du répertoire /sys/class/net/NETDEVICE/wireless est un prédicat que vous pouvez utiliser. Ceci est une approche uniquement Linux, et suppose que /sys est monté, ce qui est presque toujours le cas normal. Il est également plus facile d’utiliser cette méthode à partir de scripts, plutôt que de traiter avec ioctl () s.

Vous pouvez appeler ioctl(fd, SIOCGIWNAME) qui renvoie la version du protocole d’extension sans fil, uniquement disponible sur les interfaces sans fil.

 int check_wireless(const char* ifname, char* protocol) { int sock = -1; struct iwreq pwrq; memset(&pwrq, 0, sizeof(pwrq)); strncpy(pwrq.ifr_name, ifname, IFNAMSIZ); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return 0; } if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) { if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ); close(sock); return 1; } close(sock); return 0; } 

Pour un exemple complet, voir: https://gist.github.com/edufelipe/6108057

Il est possible de l’obtenir de C, de bien sûr.

Consultez ce lien pour des informations sur une question similaire.

Si vous ciblez NetworkManager, examinez ses API, exemples C et NMDeviceType .