我的 C/C++ 程序使用 MacOS/X 的 SystemConfiguration 函数SCDynamicsStoreCreate()和朋友来检测 Mac 的网络配置何时发生变化,或多或少如 Apple在此处提供的示例代码所示。
这很好用;特别是,我作为第三个参数传递给 SCDynamicsStoreCreate() 的回调函数会在 Mac 的任何网络接口启动或关闭时被调用。
不过,我想通过准确找出哪些接口特别是出现或关闭来改进一些事情。这样我的程序就可以很智能,并且只关闭依赖于现在已经分离的网络接口的套接字,而不是像现在那样总是重新创建所有套接字。
这是我的回调函数现在的样子:
static void IPConfigChangedCallback(SCDynamicStoreRef /*store*/, CFArrayRef changedKeys, void * info)
{
// Temporary debugging/exploratory code
int c = CFArrayGetCount(changedKeys);
for (int i=0; i<c; i++)
{
CFStringRef p = (CFStringRef) CFArrayGetValueAtIndex(changedKeys, i);
const char *cs = CFStringGetCStringPtr( p, kCFStringEncodingMacRoman ) ;
printf(" key %i: [%s]\n", i, cs);
}
RecreateSocketsAndStuff();
}
当(作为一个简单的测试)我在我的 Mac 上启用或禁用 WiFi 接口时,会调用上述函数,并打印如下输出:
key 0: [State:/Network/Service/F0B25E8E-AAEF-45A1-A484-5D8F0C2BC061/IPv4]
我怀疑那个长的十六进制字符串对应于我的 Mac 的 Wi-Fi 接口,但是我如何将该值映射到我的 Mac 的 WiFi IP 地址(或 MAC 地址,或接口索引,或任何我可以用来将此回调关联到getaddrinfo ())返回的数据?