Определите, является ли сетевой интерфейс беспроводным или проводным

У меня есть программа, которая имеет два отдельных раздела: один из них должен выполняться, когда сетевой интерфейс - это беспроводная локальная сеть, а другой - при подключении проводной локальной сети. Как я могу узнать, что внутри моей программы? Какую функцию я должен использовать для получения этой информации?

Ответ 1

Вы можете использовать команду iwconfig из командной строки:

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

Если вам нужно использовать его на C, как объясняет ссылка @opaque выше, получите источники или используйте strace, чтобы узнать, какой ioctls() вам нужно использовать:

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

См. Использование 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"...

Ответ 2

Если ваше имя устройства NETDEVICE, проверка существования каталога /sys/class/net/NETDEVICE/wireless - это предикат, который вы можете использовать. Однако это подход, основанный на Linux, и предполагает, что /sys установлен, что почти всегда является нормальным случаем. Также проще использовать этот метод из сценариев, вместо того, чтобы иметь дело с ioctl() s.

Ответ 3

Вы можете вызвать ioctl(fd, SIOCGIWNAME), который возвращает версию протокола беспроводного расширения, которая доступна только на беспроводных интерфейсах.

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;
}

Полный пример см.: https://gist.github.com/edufelipe/6108057

Ответ 4

Можно получить его, например, из С.

Обратите внимание на ссылку для получения информации по аналогичному вопросу.

Ответ 5

Если вы настроите таргетинг на NetworkManager, посмотрите на его API, Примеры C и NMDeviceType.