【发布时间】:2011-12-17 02:58:10
【问题描述】:
在 linux 中是否有任何方法,如回调或信号,以便在 IP 地址发生任何变化时得到通知。 我想用内核注册一个回调或者从内核获取一个自动完成的信号,而不是我的代码在套接字上轮询。
提前致谢。
【问题讨论】:
-
我会调查
udev -
udev 并不真正关心这个。
标签: linux linux-kernel
在 linux 中是否有任何方法,如回调或信号,以便在 IP 地址发生任何变化时得到通知。 我想用内核注册一个回调或者从内核获取一个自动完成的信号,而不是我的代码在套接字上轮询。
提前致谢。
【问题讨论】:
udev
标签: linux linux-kernel
您通过 netlink 套接字接收来自内核的通知。
您需要创建一个NETLINK_ROUTE 套接字,并通过bind()将其订阅到RTMGRP_IPV4_IFADDR 组,以订阅IP 更改。然后,您将收到RTM_NEWADDR 和RTM_DELADDR 类型的网络链接消息,其路由属性为IFA_LOCAL 或IFA_ADDRESS。
【讨论】:
没有 C 编程: 命令
$ ip monitor
每当 IP 子系统中的某些配置发生更改时,都会在其标准输出上产生输出。命令
# ip addr add 10.10.10.10/24 dev em1
产生以下输出
2: em1 inet 10.10.10.10/24 scope global em1
local 10.10.10.10 dev em1 table local proto kernel scope host src 0.10.10.10
10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10
broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10
broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10
用命令删除10.10.10.10地址
# ip addr del 10.10.10.10/24 dev em1
产生以下输出
Deleted 2: em1 inet 10.10.10.10/24 scope global em1
Deleted 10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10
Deleted broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10
Deleted broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10
Deleted local 10.10.10.10 dev em1 table local proto kernel scope host src 10.10.10.10
您可以使用 shell 和一些 awk 或 perl 来处理这些消息,或者您可以使用 popen() 和朋友 C 库函数并在 C 中处理输出。
使用 C 编程,您可以通过 NETLINK 连接到内核。这是相当复杂的,并且没有很好的记录。请参阅此 Wikipedia article 了解 Netlink 接口的起点。
【讨论】:
您可以生成“/sbin/ip monitor”作为子进程并观察其输出。
它会告诉你 IP 地址何时发生变化等。有关详细信息,请参阅 ip(8) 的手册页。
【讨论】: