- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用以下代码:
struct sockaddr_in6 *sin;
struct ifreq ifr;
sin = (struct sockaddr_in6 *)&ifr.ifr_addr;
ifr_addr
是 struct 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
是 #define
d 为 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/
目前部署在 Kubernetes 中的服务,通过 Calico BGP 将 Service 与集群外网络打通,并在外部的 nginx 中配置 Service 地址对外进行服务暴露。经过一段时间的观察
如发现here , 有一种新的 kube 服务是 IPVS 并且有很多负载均衡算法。 唯一的问题是我没有找到指定这些算法的位置。 我的理解: rr:循环法->循环调用后端pod lc:最少连接-> 将
我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到更改默认模式的方法 iptables至 ipvs在 GKE 节点上。 每个人都说通过--proxy-mo
我想在现有集群中为 IPVS 启用 Kube-proxy 模式。目前,它在 IPtables 上运行。如何在不影响现有工作负载的情况下将其更改为 IPVS? 我已经安装了所有必需的模块来启用它。另外,
我正在开发的应用程序作为 Kubernetes 集群中的部署运行。为此部署创建的 Pod 分布在集群中的各个节点上。我们的应用程序一次只能处理一个 TCP 连接,并且会拒绝进一步的连接。目前,我们使用
我是一名优秀的程序员,十分优秀!