IPv6地址分配前后会经历各种状态,例如临时地址、重复地址和首选地址。这些地址状态适用于手动和自动配置的地址。我遇到一种情况,当在暂定状态下使用网络接口时,对一天中的时间服务器的请求无限期地阻塞。(当从 python 脚本中调用 rdate 实用程序时)。通过实验,我得出结论,在接口处于暂定状态时调用 rdate 是问题所在。
我看到
ip-monitor
Run Code Online (Sandbox Code Playgroud)
可以使用命令,并 在 Linux 上的 AF_NETLINK 套接字中找到一些有趣的想法:如何以编程方式确定 NIC 接口是否已启用并插入?
我正在尝试设置一些异步调用(最好在 python3 中),一旦接口准备好并且 rdate 可以恢复,该调用就会返回。netlink 套接字似乎就是解决这个问题的工具。读完这篇文章和 netlink(7) 我发现我需要类似的东西
s = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
Run Code Online (Sandbox Code Playgroud)
但我无法找到有关从套接字获取输出后要检查哪些结构字段/设备标志的正确信息。在 netdevice(7) 中我发现
IFF_UP Interface is running.
Run Code Online (Sandbox Code Playgroud)
但我不确定在暂定状态下这是否也是如此。
当然,最简单的方法就是循环 sleep 并检查
ip a show dev devName
Run Code Online (Sandbox Code Playgroud)
直到状态有效,但我将其保留为最后的手段,以防异步调用失败。