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)
这只是用于测试,所以边缘有点粗糙.您将不得不寻找保留计数等.它的编写只是为了了解它是如何完成的.
| 归档时间: |
|
| 查看次数: |
2740 次 |
| 最近记录: |