作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我必须能够检测到我的Mac客户端的IP地址更改。从wifi上网到有线上网,每次收到新 Action 时,我都需要执行一项操作。
有人做过类似的事情吗?我目前每分钟轮询一次,因此我需要更改它以便更多地由事件驱动。
最佳答案
从IOKit通知开始,有多种方法可以执行此操作,但是最简单的方法可能是SystemConfiguration框架。
第一步是启动scutil并使用它来弄清楚您要在哪个 key 上进行通知:
$ scutil
> list
...
> n.add State:/Network/Global/IPv4
> n.watch
... unplug your network cable (or disconnect from WiFi)
notification callback (store address = 0x10e80e3c0).
changed key [0] = State:/Network/Global/IPv4
man 3 regex
定义),因此,如果您要观看例如任何用于IPv4的NIC,则可以使用
State:/Network/Interface/.*/IPv4
,或者如果您要说全局IPv4或IPv6,
State:/Network/Global/IPv.
等。
#!/usr/bin/python
from Foundation import *
from SystemConfiguration import *
def callback(store, keys, info):
for key in keys:
print key, SCDynamicStoreCopyValue(store, key)
store = SCDynamicStoreCreate(None,
"global-network-watcher",
callback,
None)
SCDynamicStoreSetNotificationKeys(store,
None,
['State:/Network/Global/IPv4'])
CFRunLoopAddSource(CFRunLoopGetCurrent(),
SCDynamicStoreCreateRunLoopSource(None, store, 0),
kCFRunLoopCommonModes)
CFRunLoopRun()
def callback(store, keys, info):
for key in keys:
print key, SCDynamicStoreCopyValue(store, key)
void callback(SCDynamicStoreRef store, CFArrayRef keys, void *info) {
/* iterate over keys, printing something for each one */
}
if i am trying to determine a network change, wifi to LAN
/Network/Global
会通知您。如果操作系统可以告知LAN实际上未连接到Internet,或者您已经更改了一些隐藏设置以使其更喜欢WiFi而不是LAN等,则它不会更改默认地址,并且
/Network/Global
不会通知您,但您可能不在乎。
State:/Network/Interface/en0/IPv4
。如果您希望在任何接口(interface)发生更改时都收到通知,只需观看
State:/Network/Interface/.*/IPv4
即可。
or to hotspot or another wifi
Global
,这意味着上面的代码将按原样工作。如果您的默认地址仍然是您的LAN,则
Global
不会更改,但您可能不在乎。如果您确实需要的话,请如上所述观看
Interface/en1
或
Interface/.*
等。
what all network settings should I be watching for IPV4 and 6
IPv.
即可。但是,您真的关心IPv6吗?
what else
关于c++ - 如何在C或C++中以编程方式检测OSX上的IP地址更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11532144/
我是一名优秀的程序员,十分优秀!