- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
IPv6地址分配前后,会经历暂定地址、重复地址、首选地址等多种状态。这些地址状态适用于手动和自动配置的地址。我有一种情况,在暂定状态下使用网络接口(interface)时,对一天中的时间服务器的请求会无限期地阻塞。 (当从 python 脚本中调用 rdate 实用程序时)。通过实验,我设法得出结论,当界面的暂定状态是问题所在时调用 rdate。
我看到了
ip-monitor
command can be used and found some interesting ideas here with AF_NETLINK socket On Linux: how can I programmatically determine if a NIC interface is enabled and plugged in?
我正在尝试设置一些异步调用(最好是在 python3 中),一旦接口(interface)准备好并且 rdate 可以恢复,它将返回。而 netlink 套接字似乎只是解决问题的工具。看完this和 netlink(7) 我看到我需要类似的东西
s = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
但是我无法找到关于从套接字获得输出后要检查哪些结构字段/设备标志的正确信息。在 netdevice(7) 中我找到了
IFF_UP Interface is running.
但我不确定这在暂定状态下是否也不是真的。
当然,简单的方法就是循环 sleep 并检查
ip a show dev devName
直到状态有效,但我将其保留为万一异步调用失败的最后手段。
最佳答案
如果你想监控IPv6地址变化和状态可以采用我的example你提到的。
就您只对 IPv6 地址通知感兴趣而言,您应该替换此字符串:
local.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
用这个:
local.nl_groups = RTMGRP_IPV6_IFADDR;
这是在 RTM_NEWADDR/RTM_DELADDR 情况下你应该做的:
struct ifaddrmsg *ifa = NLMSG_DATA(h);
struct rtattr *tb[IFLA_MAX + 1];
parseRtattr(tb, IFA_MAX, IFA_RTA(ifa), h->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
if (!tb[IFA_LOCAL]) {
tb[IFA_LOCAL] = tb[IFA_ADDRESS];
}
if (!tb[IFA_ADDRESS]) {
tb[IFA_ADDRESS] = tb[IFA_LOCAL];
}
char ifAddress[INET6_ADDRSTRLEN];
switch (h->nlmsg_type) {
case RTM_NEWADDR:
if (tb[IFA_LOCAL]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_LOCAL]), ifAddress, sizeof(ifAddress));
printf("New local IPv6 address: %s\n", ifAddress);
} else if (tb[IFA_BROADCAST]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_BROADCAST]), ifAddress, sizeof(ifAddress));
printf("New local IPv6 address: %s\n", ifAddress);
} else if (tb[IFA_ANYCAST]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_ANYCAST]), ifAddress, sizeof(ifAddress));
printf("New anycast IPv6 address: %s\n", ifAddress);
}
if (tb[IFA_CACHEINFO]) {
struct ifa_cacheinfo *ci = RTA_DATA(tb[IFA_CACHEINFO]);
if (ci->ifa_valid == 0xFFFFFFFFU) {
printf("ifa_valid infinity\n");
} else {
printf("ifa_valid = %u sec\n", ci->ifa_valid);
}
if (ci->ifa_prefered == 0xFFFFFFFFU) {
printf("ifa_prefered = %u sec\n", ci->ifa_prefered);
}
}
break;
case RTM_DELADDR:
printf("IPv6 address was deleted\n");
break;
}
这是一个快速而肮脏的例子,但你应该看看它是如何工作的。在这个例子中,我们处理 netlink 消息中的 ifaddrmsg 数据,以获得分配的 ipv6 地址。
也许最有趣的部分是 IFA_CACHEINFO。此时我们可以检查地址缓存并获得有关地址有效和首选状态的一些有用信息。如您所见,可以设置一些超时值或无穷大值。您可以使用网络接口(interface)来发现 IPv6 地址和 IFA_CACHEINFO 状态的不同状态。
关于linux - 如何异步检查 ipv6 网络接口(interface)是否在 linux 中将状态从 tentative 更改为 "valid"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55614270/
目前部署在 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 连接,并且会拒绝进一步的连接。目前,我们使用
我是一名优秀的程序员,十分优秀!