【问题标题】:Determine if a network interface is wireless or wired确定网络接口是无线还是有线
【发布时间】:2012-09-24 14:18:57
【问题描述】:

我有一个程序,它有两个独立的部分:其中一个应在网络接口为无线 LAN 时执行,另一个应在其为有线 LAN 连接时执行。我怎么能在我的程序中知道这一点?我应该使用什么函数来获取这些信息?

【问题讨论】:

  • 如果有几个网络接口都在并行使用怎么办?
  • 代码的无线部分将针对那些是无线的和有线的部分并行执行。

标签: c linux sockets networking


【解决方案1】:

如果您的设备名称是NETDEVICE,则检查/sys/class/net/NETDEVICE/wireless 目录是否存在是您可以使用的谓词。不过,这是一种仅限 Linux 的方法,它假定已挂载 /sys,这几乎总是正常情况。从脚本中使用这种方法也更容易,而不是处理 ioctl()s。

【讨论】:

    【解决方案2】:

    您可以从命令行使用 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 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"...
    

    【讨论】:

    • 嗯...对不起,我在这里很新。我可以选择你的答案和不透明的作为“正确”答案吗?
    • 不幸的是不是 ;) 您可以对他们两个都投赞成票,但您应该接受最能回答您的问题的那个。这是你的决定:)
    【解决方案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】:

      如果您以 NetworkManager 为目标,请查看其 API,C examplesNMDeviceType

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-19
        • 2023-03-09
        • 2016-08-09
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多