如何在Mac上的Objective-C中确定活动接口的网络掩码?

Mar*_*tin 4 macos networking cocoa objective-c netmask

我正在尝试确定我的Macbook所在的网段,因为我想使用CFHost类扫描此段以查找活动主机(基本IP扫描程序).因此,我需要我的活动界面的IP和网络掩码.这就是我获取IP的方式:

NSString *ipAddr = [[[NSHost currentHost] addresses] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

但我完全不知道如何获得Netmask,所以我有点卡住了.特别是因为我在Objective-C上相当新,因为我也没有普通C的广泛知识.我看过CFHost,CFNetwork,NSHost和各种谷歌点击,但到目前为止没有找到任何有用的东西.

作为最后的手段,我可​​以进行各种系统调用,或者从文件中读取它(哪一个?),但我想尽可能避免这种情况.

那么,如何通过NSHost获得匹配的网络掩码?任何建议将不胜感激.

谢谢!

Mar*_*tin 12

因此,为了总结这一点,我终于开始研究系统配置API.一如既往,一旦你知道它并不那么困难.

@ 0xced - 感谢您指出我正确的方向.我会回答你的回答,但我没有足够的声誉这样做.

对于任何好奇或处于相同情况的人来说,这是我的解决方案.它涉及挖掘动态商店.请参阅有关API的相关信息.您可以使用scutil命令行实用程序查看动态存储所包含的信息(请参阅x-man-page:// 8/scutil).

这是我的步骤.首先,您需要一个会话:

SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

然后,我尝试获取主接口(例如en1):

CFPropertyListRef global = SCDynamicStoreCopyValue (storeRef,CFSTR("State:/Network/Global/IPv4"));
NSString *primaryInterface = [(__bridge NSDictionary *)global valueForKey:@"PrimaryInterface"];
Run Code Online (Sandbox Code Playgroud)

最后,我构建了一个包含接口的字符串,以便能够查询正确的密钥.当然,它看起来应该像State:/ Network/Interface/en1/IPv4,具体取决于接口.有了这个,我能够获得一个带有ip和netmask的数组.在我的Macbook上,这些数组分别只保存一个ip和netmask.我想这可能与其他Mac有所不同,我将不得不验证.对于我的测试,我只是采用了数组中的第一个(也是唯一的)元素,但是必须在那里实现某种大小的检查.

NSString *interfaceState = [NSString stringWithFormat:@"State:/Network/Interface/%@/IPv4", primaryInterface];

CFPropertyListRef ipv4 = SCDynamicStoreCopyValue (storeRef, (CFStringRef)interfaceState);
CFRelease(storeRef);

NSString *ip = [(__bridge NSDictionary *)ipv4 valueForKey:@"Addresses"][0];
NSString *netmask = [(__bridge NSDictionary *)ipv4 valueForKey:@"SubnetMasks"][0];
CFRelease(ipv4);
Run Code Online (Sandbox Code Playgroud)

这只是用于测试,所以边缘有点粗糙.您将不得不寻找保留计数等.它的编写只是为了了解它是如何完成的.