Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OSX上“主网络接口”的精确定义_C++_Objective C_Macos_Networking_Mac Address - Fatal编程技术网

C++ OSX上“主网络接口”的精确定义

C++ OSX上“主网络接口”的精确定义,c++,objective-c,macos,networking,mac-address,C++,Objective C,Macos,Networking,Mac Address,我正在考虑在OSX上使用MAC地址作为机器标识符的一部分。developer.apple.com上的GetPrimaryMACAddress.c示例演示了如何获取主以太网接口的MAC地址。我的问题是主以太网接口的精确定义是什么?评论将其描述为内置网卡。在具有多个内置接口的系统上会发生什么情况?例如,Mac Pros可以有两个有线插头,而较旧的Macbook Pros则有一个有线和无线插孔 我能找到的关于这个的唯一文档是IONetworkInterface.h参考。它将kIOPrimaryInte

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


我能找到的关于这个的唯一文档是IONetworkInterface.h参考。它将kIOPrimaryInterface定义为描述接口是主接口还是内置网络接口。这并没有回答我关于当有多个内置接口时会发生什么的问题。

根据苹果的开源页面

我想您正在寻找这个特定的代码


在我看来,任何不在插槽中的以太网卡都是主接口,因此可以有多个主接口。这与我在问题中提到的developer.apple.com示例中的一条评论相矛盾,他们声称您应该只有一条。我还担心ifdef uuu ppc uuu宏。x86怎么样,除非这里的ppc不是指体系结构?此外,从链接文件评论中的版权声明来看,这段代码可能很旧,这可能解释了ppc的问题。从代码的日期来看,它不是PowerPC而不是x86,它是PowerPC而不是Motorola 68K。标记为uuppc_uuuu的代码分支可能适用于x86。如果您有多个内置端口->只有0是主端口。如果你有无线以太网和以太网->你有2个初级。在示例代码中,您循环遍历结果并获取最后一个。@xhruso00 Aha!所以你可以有不止一个。拿最后一个似乎不是个好主意。我看不到任何迹象表明此列表的顺序是有保证的。不过,这个案子很容易处理。谢谢@当我今天早些时候评论你更新了答案时,我没有注意到。更新回答了我的问题:主要是单元号为0的接口。我们在带有两个有线以太网接口和一个无线接口的Mac Pro上进行了测试。其中一个有线接口被选为主要接口。机器通过无线接口连接到互联网。我不知道主要网络接口的正式定义,但我猜如果有一个BSD名称为en0的,您可以将其视为主要接口。请注意,您可以使用SystemConfiguration.framework中的函数查找网络地址。
//------------------------------------------------------------------------------
// 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;
}