これをまとめて、私はついにシステムコンフィグレーションAPIを調査しました。いつものように、一度それがそれほど難しくない方法を知っている。
@ 0xced - 正しい方向に私を指摘してくれてありがとう。私はあなたの答えをアップアップしたいと思いますが、そうするには十分な評判がありません。
これは私の解決策です。好奇心が強い人や同じ状況の人のためです。ダイナミックストアを掘り下げることです。 APIの情報については、thisを参照してください。 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とnetmaskで配列を取得できます。私のMacbookでは、これらの配列はそれぞれ1つの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);
これはテストのためのものであり、エッジの周りはやや粗いです。あなたは保持カウントなどを探す必要があります。どのようにして行うことができるのかを知るために書かれただけです。
おそらく、私があまりにも狭く、これを定義しています。 Objective-Cには、ネットマスクなどを介して、私が入っているネットワークセグメントを見つける方法がありますか? – Martin