c语言 - 如何关联(传递给 SCDynamicStoreCreate() 回调的更改密钥字符串)到网络设备?



我的 C/C++ 程序使用 MacOS/X 的 SystemConfiguration 函数 SCDynamicsStoreCreate() 和 friends 来检测 Mac 的网络配置何时发生了变化,或多或少如 Apple 在此处提供的示例代码所示。

这工作得很好;特别是,每当Mac的任何网络接口启动或关闭时,我作为第三个参数传递给SCDynamicsStoreCreate()的回调函数确实会被调用。

不过,我想通过准确找出哪些接口特别出现或下降来稍微完善一下。 这样,我的程序就可以很智能,并且仅关闭依赖于现已离开的网络接口的套接字,而不是像当前那样始终重新创建所有套接字。

这是我的回调函数现在的样子:

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()) 返回的数据相关联的任何内容)?

键将相对于系统配置架构进行解释。 如系统配置编程指南中的其他部分所述:

尽管架构不是私有系统 API,但它的级别非常低。 应用程序应尽可能避免直接依赖 架构并改用更高级别的接口。

也就是说,您可以将密钥传递给SCDynamicStoreCopyValue()以检查它为您提供了什么。 我相信你会得到一个属性及其值的字典。

还可以使用 scutil 命令以交互方式浏览系统配置存储。 例如,使用从回调中获得的密钥发出 show 命令。 在我的系统上,我得到一个字典,显示子网掩码、路由器、接口名称和 IP 地址。

相关内容

  • 没有找到相关文章

最新更新