2011-12-17 137 views
9

在Linux中是否有任何方法(如回拨或信号)在IP地址发生任何更改时得到通知。 我想用内核注册一个回调,或者从内核获取一个信号,而这个信号是自动完成的,而不是我的代码在套接字上轮询。如何自动获得有关IP地址更改的通知

在此先感谢。

+0

我想看看`udev` – 2011-12-17 07:29:27

回答

16

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

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

1

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

它会告诉你什么时候IP地址发生变化等。有关更多详细信息,请参阅ip(8)的手册页。

3

没有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 

可以使用EIT她的shell以及一些awk或perl来处理这些消息,或者您可以使用popen()和好友C库函数并处理C中的输出。使用C编程,您可以通过NETLINK连接到内核。这是相当复杂的,并没有很好的记录。请参阅此Wikipedia article以获取Netlink接口的起始点。