如何自动获得IP地址更改通知

时间:2011-12-17 02:58:10

标签: linux linux-kernel

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

提前感谢。

3 个答案:

答案 0 :(得分:18)

您通过netlink套接字从内核收到通知。

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

答案 1 :(得分:3)

没有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()和friends C库函数来处理C中的outpout。

使用C编程,您可以通过NETLINK挂钩内核。这是相当复杂的,并没有很好地记录。请参阅此Wikipedia article以获取Netlink界面的起点。

答案 2 :(得分:1)

您可以将“/ sbin / ip monitor”作为子进程生成并观察其输出。

它将告诉您何时更改IP地址等。有关详细信息,请参阅ip(8)的手册页。