因此,爲了解決這個問題,我終於開始研究系統配置API。一如既往,一旦你知道它不那麼困難。
@ 0xced - 感謝您指引我正確的方向。我會贊成你的回答,但我沒有足夠的聲望去做。
這是我的解決方案,適合任何好奇或處於相同情境的人。它涉及挖掘動態商店。請參閱this瞭解API的相關信息。您可以使用scutil命令行實用程序查看動態存儲庫保存的信息(請參閱x-man-page:// 8/scutil)。
這是我的步驟。首先,你需要一個會話:
SCDynamicStoreRef storeRef = SCDynamicStoreCreate(NULL, (CFStringRef)@"FindCurrentInterfaceIpMac", NULL, NULL);
於是,我試圖讓主接口(EN1爲例):
CFPropertyListRef global = SCDynamicStoreCopyValue (storeRef,CFSTR("State:/Network/Global/IPv4"));
NSString *primaryInterface = [(__bridge NSDictionary *)global valueForKey:@"PrimaryInterface"];
最後,我建立包含接口,以便能夠爲一個字符串查詢右鍵。它應該看起來像State:/ Network/Interface/en1/IPv4,當然取決於接口。有了這個,我可以得到一個數組與IP和網絡掩碼。在我的Macbook上,這些陣列分別僅保存一個IP和網絡掩碼。我想這可能會對其他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);
這只是爲了測試,所以它有點粗糙的邊緣。你將不得不尋找保留計數等。它只是爲了瞭解它是如何完成的。
也許是我太狹隘定義這一點。 Objective-C中有沒有一種方法可以通過網絡掩碼或其他方法找出我所在的網段? – Martin