gpt4 book ai didi

c++ - `ifreq` 结构中的 IPv6 地址问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:30 27 4
gpt4 key购买 nike

我正在使用以下代码:

struct sockaddr_in6 *sin;
struct ifreq ifr;
sin = (struct sockaddr_in6 *)&ifr.ifr_addr;

ifr_addrstruct sockaddr 类型,为方便起见,此处报告如下:

struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};

如果只有 14 个字节可用,我应该如何将 IPv6 地址(通过 sin->sin6_addr.s6_addr)放入 ifr_addr 字段?

我哪里错了?

TIA,克里斯

最佳答案

幸运的是,struct ifreq 被声明为在结构末尾的 union 中包含地址:

struct ifreq
{


union
{
char ifrn_name[16];
} 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[16];
char ifru_newname[16];
__caddr_t ifru_data;
} ifr_ifru;
};

请注意,上面是 gcc -E 的结果,因此所有预处理器的内容都已扩展。另请注意,ifr_addr#defined 为 ifr_ifru.ifru_addr

这意味着从技术上讲,您可以在结构末尾分配字节来保存地址。

在我看来,这是非常草率的。 union 应该被声明为保存类型 sockaddr_storage 的值以及其他所有内容。然后结构大小将大到足以容纳任何地址。

如果您想声明自己的大小合适且可以很容易使用的结构,只需执行以下操作:

union my_ifreq {
struct ifreq sys_ifreq;
struct {
char name_pad[IFNAMSIZ];
struct sockaddr_storage addr;
} padding;
};

然后您将拥有一个始终具有足够存储空间的结构,您可以在 sys_ifreq.ifr_addr 中填充任何有效地址并让它工作。

关于c++ - `ifreq` 结构中的 IPv6 地址问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5516500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com