在linux中有任何方法,如回调或信号,以便在IP地址发生任何变化时得到通知。 我想用内核注册回调或从内核获取一个信号,这个信号是自动完成的,而不是我的代码在套接字上轮询。
提前感谢。
答案 0 :(得分:18)
您通过netlink套接字从内核收到通知。
您需要创建一个NETLINK_ROUTE
套接字,并通过bind()
将其订阅到RTMGRP_IPV4_IFADDR
组进行IP更改。然后,您将收到类型为RTM_NEWADDR
和RTM_DELADDR
的netlink消息,其路由属性为IFA_LOCAL
或IFA_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)的手册页。