【问题标题】:What are the network ioctl man pages?什么是网络 ioctl 手册页?
【发布时间】:2011-02-08 17:10:57
【问题描述】:

我想使用 ioctl SIOCGIFADDR 来确定 Linux 中接口的地址。我找到了一些解释如何做到这一点的网络参考资料,但似乎我的系统上应该已经有一些参考资料了。是否有描述 SIOCGIFADDR 和朋友的手册页(或其他内容)? man netdevice 很接近,但它没有相关的 ioctl。

【问题讨论】:

    标签: linux networking ioctl


    【解决方案1】:

    ioctls 似乎已被弃用。更好的方法(虽然方法更复杂)是使用netlink。例如,请参阅 this article,了解如何通过 netlink 列出所有接口(有关 ioctl 版本,请参阅该文章迷你系列的 part 2)。还有一些库可以更轻松地与netlink 交互,例如libnllibmnl。另见this SO question

    编辑: Here's an example 关于如何通过 netlink 获取所有接口的 IP 地址。

    【讨论】:

    • aix 最接近回答我的实际问题,但你明白了,所以请投赞成票。您链接到的 SO question 建议将 getifaddrs 作为替代方案,并且它有一个不错的联机帮助页,因此这似乎是以一种不混淆的方式执行此操作的最不痛苦的方法。
    【解决方案2】:

    我能在我的 Ubuntu 系统上找到的最接近的(通过使用手册页和头文件)是 man ioctl_list,它将调用列为:

       0x00008915   SIOCGIFADDR         struct ifreq *           // I-O
    

    有问题的结构 (ifreq) 在 /usr/include/net/if.h 中声明,并附有解释每个字段含义的简短 cmets。

       /* Interface request structure used for socket ioctl's.  All interface
           ioctl's must have parameter definitions which begin with ifr_name.
           The remainder may be interface specific.  */
    
        struct ifreq
          {
        # define IFHWADDRLEN    6
        # define IFNAMSIZ       IF_NAMESIZE
            union
              {
                char ifrn_name[IFNAMSIZ];       /* Interface name, e.g. "en0".  */
              } ifr_ifrn;
    
            union
              {
                struct sockaddr ifru_addr;
                struct sockaddr ifru_dstaddr;
                struct sockaddr ifru_broadaddr;
                struct sockaddr ifru_netmask;
                struct sockaddr ifru_hwaddr;
                short int ifru_flags;
                int ifru_ivalue;
                int ifru_mtu;
                struct ifmap ifru_map;
                char ifru_slave[IFNAMSIZ];      /* Just fits the size */
                char ifru_newname[IFNAMSIZ];
                __caddr_t ifru_data;
              } ifr_ifru;
          };
        # define ifr_name       ifr_ifrn.ifrn_name      /* interface name       */
        # define ifr_hwaddr     ifr_ifru.ifru_hwaddr    /* MAC address          */
        # define ifr_addr       ifr_ifru.ifru_addr      /* address              */
        # define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */
        # define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */
        # define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */
        # define ifr_flags      ifr_ifru.ifru_flags     /* flags                */
        # define ifr_metric     ifr_ifru.ifru_ivalue    /* metric               */
        # define ifr_mtu        ifr_ifru.ifru_mtu       /* mtu                  */
        # define ifr_map        ifr_ifru.ifru_map       /* device map           */
        # define ifr_slave      ifr_ifru.ifru_slave     /* slave device         */
        # define ifr_data       ifr_ifru.ifru_data      /* for use by interface */
        # define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */
        # define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth       */
        # define ifr_qlen       ifr_ifru.ifru_ivalue    /* queue length         */
        # define ifr_newname    ifr_ifru.ifru_newname   /* New name             */
        # define _IOT_ifreq     _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
        # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
        # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)
    

    除了上述之外,我觉得网络是你最好的选择。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 这一定是 linux 附带的最过时的联机帮助页,“[ ... ] Linux/i386 内核 1.3.27 中的 ioctl 调用列表。”。是的,即使是最新/最伟大的发行版仍然有那个。
      【解决方案4】:

      netintro(4) 有一个最小的摘要。可惜它在 linux 上不可用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        相关资源
        最近更新 更多