Si el nombre de su dispositivo es NETDEVICE
, una comprobación de la existencia del /sys/class/net/NETDEVICE/wireless
directorio es un predicado que puede usar. Sin embargo, este es un enfoque solo para Linux y asume que /sys
está montado, que es casi siempre el caso normal. También es más fácil emplear este método desde secuencias de comandos, en lugar de lidiar con ioctl().
Puedes llamar al ioctl(fd, SIOCGIWNAME)
que devuelve la versión del protocolo de extensión inalámbrica, que solo está disponible en interfaces que son inalámbricas.
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;
}
Para ver un ejemplo completo, consulte:https://gist.github.com/edufelipe/6108057
Puede usar el comando iwconfig desde la línea de comando:
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
Si necesita usarlo desde C, como explica el enlace de @opaque arriba, obtenga las fuentes o use strace para ver qué ioctls() necesita usar:
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
Ver uso 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"...