【发布时间】: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