如何自动通知IP地址更改

在linux中有任何方法,如callback或信号,以获得通知,只要有IP地址的任何变化。 我想用内核注册一个callback,或者从内核获取一个信号,而这个信号是自动完成的,而不是我的代码轮询在套接字上。

提前致谢。

Solutions Collecting From Web of "如何自动通知IP地址更改"

您通过netlink套接字接收来自内核的通知。

您需要创建一个NETLINK_ROUTE套接字,并通过bind()RTMGRP_IPV4_IFADDR组来将其订阅到IP更改。 然后,您将收到路由属性为IFA_LOCALIFA_ADDRESS RTM_NEWADDRRTM_DELADDR类型的netlink消息。

没有C编程:命令

 $ ip monitor 

只要IP子系统中的某些配置发生变化,就会在其stdout上产生输出。 命令

 # 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中处理outpout。

使用C编程,您可以通过NETLINK连接到内核。 这是相当复杂的,没有很好的记录。 看到这个维基百科文章的起点到Netlink接口。

你可以产生“/ sbin / ip monitor”作为子进程并观察它的输出。

它会告诉你什么时候IP地址发生变化等。更多细节请参见ip(8)的手册页。