【问题标题】:struct ifreq : different definition in "linux/if.h" and man pagestruct ifreq : "linux/if.h" 和手册页中的不同定义
【发布时间】:2015-10-14 08:00:23
【问题描述】:

在线手册netdevice(7) - Linux man page中,ifreq结构的定义如下:

struct ifreq {
               char ifr_name[IFNAMSIZ]; /* Interface name */
               union {
                   struct sockaddr ifr_addr;
                   struct sockaddr ifr_dstaddr;
                   struct sockaddr ifr_broadaddr;
                   struct sockaddr ifr_netmask;
                   struct sockaddr ifr_hwaddr;
                   short           ifr_flags;
                   int             ifr_ifindex;
                   int             ifr_metric;
                   int             ifr_mtu;
                   struct ifmap    ifr_map;
                   char            ifr_slave[IFNAMSIZ];
                   char            ifr_newname[IFNAMSIZ];
                   char           *ifr_data;
               };
           };

但是我的 linux 标头显示了不同的定义。以下是来自 /usr/include/linux/if.h 的定义 我使用的内核版本是 Linux 3.18

struct ifreq {
#define IFHWADDRLEN 6
    union
    {
        char    ifrn_name[IFNAMSIZ];        /* if 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   ifru_flags;
        int ifru_ivalue;
        int ifru_mtu;
        struct  ifmap ifru_map;
        char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
        char    ifru_newname[IFNAMSIZ];
        void *  ifru_data;
        struct  if_settings ifru_settings;
    } ifr_ifru;
};

为什么要做出这样的改变?对于不同的 Linux 发行版,我应该坚持哪一个?

【问题讨论】:

  • 你链接的那个页面已经快 2 年了...
  • POSIX 不强制要求这种结构,它是 Linux 特定的。因此,如果您想要便携性,您根本无法真正使用它。
  • 另外,如果您查看例如/usr/include/net/if.h 然后你会看到所有字段也有别名,通过使用预处理宏,所以只使用my_ifreq_ptr->ifr_name 会被预处理器自动替换为my_ifreq_ptr->ifr_ifrn.ifrn_name
  • 查看 git 日志以了解进行此更改的原因。
  • @JoachimPileborg,谢谢。我错过了#defines。我在通过 gnu GDB 调试时遇到了这种困惑。由于宏不适用于该状态,因此我遇到了错误。现在明白了!!

标签: c++ c linux network-programming


【解决方案1】:

不同的头文件; linux/if.h 和 net/if.h 类似,但除非您使用的是 linux 内核而不是 linux 用户空间,否则您可能希望使用 net/if.h。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多