网络ioctl手册页是什么?

4

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

4个回答

4
ioctl似乎已经被弃用。更好的方法(尽管更加复杂)是使用netlink。例如,可以查看此文章了解如何通过netlink列出所有接口(有关ioctl版本,请参见该文章迷你系列的第2部分)。还有一些库可以更轻松地与netlink交互,例如libnllibmnl。也可以参考这个SO问题编辑:这里有一个示例,演示如何通过netlink获取所有接口的IP地址。

aix 最接近回答了我的实际问题,但你理解了我的意图,所以我给你点赞。你提供的 SO 问题建议使用 getifaddrs 作为替代方案,并且它有一个不错的 manpage,因此这似乎是以最少困惑的方式完成此操作的方法。 - Jim Hunziker

2

在我的Ubuntu系统中,最接近的参考资料是通过man页和头文件进行搜索得到的man ioctl_list,它将调用列为:

   0x00008915   SIOCGIFADDR         struct ifreq *           // I-O

所涉及的结构体(ifreq)在/usr/include/net/if.h中声明,并附有简要注释,解释了每个字段的含义。

   /* 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)

除了上述方法,我认为网络是你最好的选择。

1

1
这一定是随 Linux 发行的最过时的 man 手册之一,"[...] 列出了 Linux/i386 内核 1.3.27 中的 ioctl 调用列表。" 是的,即使是最新/最伟大的发行版仍然有这个。 - FrankH.

0

netintro(4) 具有最少的摘要。很遗憾它不适用于Linux。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接