【问题标题】:Precise definition of "Primary Network Interface" on OSXOSX 上“主网络接口”的精确定义
【发布时间】:2014-08-13 19:47:47
【问题描述】:

我正在考虑在 OSX 上使用 MAC 地址作为机器标识符的一部分。 developer.apple.com 上的 GetPrimaryMACAddress.c 示例演示了如何获取“主”以太网接口 (https://developer.apple.com/library/mac/samplecode/GetPrimaryMACAddress/Listings/GetPrimaryMACAddress_GetPrimaryMACAddress_c.html) 的 MAC 地址。我的问题是“主以太网接口的精确定义是什么?” cmets 将其描述为“内置”网卡。在具有多个内置接口的系统上会发生什么?例如,Mac Pro 可以有两个有线插头,而较旧的 Macbook Pro 有一个有线和无线插孔。

我能找到的唯一文档是 IONetworkInterface.h 参考 (https://developer.apple.com/library/mac/documentation/Kernel/Reference/IONetworkInterface_header_reference/Reference/reference.html)。它将kIOPrimaryInterface 定义为描述“接口是主网络接口还是内置网络接口”。这并没有回答我关于当有多个内置接口时会发生什么的问题。

【问题讨论】:

  • 我不知道主要网络接口的官方定义,但我猜如果有一个 BSD 名称为“en0”的接口,您可以将其视为主要网络接口。请注意,您可以使用 SystemConfiguration.framework 中的函数来查找网络地址。

标签: c++ objective-c macos networking mac-address


【解决方案1】:

根据苹果的开源页面here

我认为您正在寻找此特定代码/* Returns a Base-64 encoded MD5 hash of 'username:primary-mac-address' */

//------------------------------------------------------------------------------
// Returns true if the receiver of this method is the system's primary
// network interface.

bool IONetworkInterface::isPrimaryInterface() const
{
    IOService * provider  = _driver;
    bool        isPrimary = false;

    if ( provider ) provider = provider->getProvider();

    // Look for the built-in property in the ethernet entry.

    if ( provider && provider->getProperty("built-in") && getUnitNumber() == 0)
    {
        isPrimary = true;
    }

    return isPrimary;
}

【讨论】:

  • 这在我看来就像任何不在插槽中的以太网卡都是主要的,因此您可以有多个主要接口。这与我在问题中提到的 developer.apple.com 示例中的评论相矛盾(他们声称您应该只有一个)。我也担心ifdef __ppc__ 宏。 x86 怎么样(除非 ppc 在这里不是指架构)?此外,从链接文件的 cmets 中的版权声明来看,这段代码可能已经很老了(这可能解释了 ppc 的问题)。
  • 从该代码的日期来看,它不是 PowerPC 而不是 x86,而是 PowerPC 而不是 Motorola 68K。标记为 __ppc__ 的代码分支可能适用于 x86。
  • 如果你有多个内置端口 -> 只有“0”是主要的。如果您有无线以太网和以太网 -> 您有 2 个原色。在示例代码中,您循环遍历结果并获取最后一个。
  • @xhruso00 啊哈!所以你可以拥有不止一个。拿最后一个似乎不是一个好主意。我看不出有任何迹象表明此列表的顺序是有保证的。不过,这种情况很容易处理。谢谢!
  • @xhruso00 我今天早些时候评论说您已更新答案时没有注意到。更新回答了我的问题:主要是单元编号为 0 的接口。我们在具有两个有线以太网接口和一个无线接口的 Mac Pro 上进行了测试。选择其中一个有线接口作为主要接口(机器通过无线接口连接到互联网)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多