struct ifreq:“ linux / if.h”和手册页中的不同定义

ano*_*abu 5 c c++ linux network-programming

在在线手册页netdevice(7)-Linux手册页中,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;
               };
           };
Run Code Online (Sandbox Code Playgroud)

但是我的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;
};
Run Code Online (Sandbox Code Playgroud)

为什么要进行此更改?为了在不同的Linux发行版上具有可移植性,我应该坚持哪一个?

Dan*_*ham 3

不同的头文件;linux/if.h 和 net/if.h 类似,但除非您针对 Linux 内核而不是 Linux 用户空间工作,否则您可能需要使用 net/if.h。