2

我的 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 ())返回的数据?

4

1 回答 1

1

关键是要相对于System Configuration Schema进行解释。如系统配置编程指南中的其他地方所述:

虽然 schema 不是私有系统 API,但它的级别非常低。应用程序应尽可能避免直接依赖模式,而是使用更高级别的接口。

也就是说,您可以将密钥传递SCDynamicStoreCopyValue()给检查它给您的信息。我相信您会得到一本属性及其值的字典。

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

于 2013-11-02T04:32:24.620 回答