Determine if a network interface is wireless or wired

后端 未结 4 1378
时光取名叫无心
时光取名叫无心 2021-01-04 09:19

I have a program that has two separate sections: one of them should be executed when the network interface is wireless LAN and the other one when it\'s a wired LAN connectio

相关标签:
4条回答
  • 2021-01-04 09:23

    You can call ioctl(fd, SIOCGIWNAME) that returns the wireless extension protocol version, which is only available on interfaces that are wireless.

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

    For a complete example see: https://gist.github.com/edufelipe/6108057

    0 讨论(0)
  • 2021-01-04 09:26

    You can use the iwconfig command from the command line:

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

    If you need to use it from C, as @opaque's link above explains, get the sources or use strace to see which ioctls() you need to use:

    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
    

    See SIOCGIWNAME usage:

    #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"...
    
    0 讨论(0)
  • 2021-01-04 09:45

    If your device name is NETDEVICE, a check of the existence of the /sys/class/net/NETDEVICE/wireless directory is a predicate you can use. This is a Linux-only approach, though, and it assumes that /sys is mounted, which is almost always the normal case. It's also easier to employ this method from scripts, rather than dealing with ioctl()s.

    0 讨论(0)
  • 2021-01-04 09:47

    If you target NetworkManager then take a look at its API, C examples and NMDeviceType.

    0 讨论(0)
提交回复
热议问题