Mac のネットワークインターフェースの情報取得

この記事は2013年3月12日に書かれたものです。
現在は内容が古い可能性が高いのでご注意ください。

Mac アプリから SystemConfiguration.framework を使ってネットワークの種類やら IPアドレスを取得してみました。
基本的にはあやしいURLの様なものを作って問い合わせて結果をDictionaryに入れてもらう感じです。

参考にさせていただいたサイト:
SystemConfiguration.framework でネットワークの情報を得る

上記に加えてプライマリー以外のインターフェースについての情報と、インターフェースの種類もとるようにしてみました。
とりあえず動くだけで、Release漏れがないかとか詳細はちゃんと検証していません。

SCDynamicStoreRef store;
SCDynamicStoreContext context;
CFStringRef key;
CFDictionaryRef val;

NSArray *interfaces;

memset(&context, 0, sizeof(context));
context.info = self;
store = SCDynamicStoreCreate(NULL, (CFStringRef)[[NSBundle mainBundle] bundleIdentifier], NULL, &context);

key = SCDynamicStoreKeyCreateNetworkInterface(NULL, kSCDynamicStoreDomainState);
val = (CFDictionaryRef)SCDynamicStoreCopyValue(store, key);
interfaces = [NSArray arrayWithArray:[(NSDictionary *)val objectForKey:@”Interfaces”]];
CFRelease(val);
CFRelease(key);

SCPreferencesRef preferences = SCPreferencesCreate(kCFAllocatorDefault, CFSTR(“PRG”), NULL);
CFArrayRef serviceArray = SCNetworkServiceCopyAll(preferences);
for (int i = 0;i < CFArrayGetCount(serviceArray);i++) {
SCNetworkServiceRef serviceRef = (SCNetworkServiceRef)CFArrayGetValueAtIndex(serviceArray, i);
SCNetworkInterfaceRef interface = SCNetworkServiceGetInterface(serviceRef);
key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL, kSCDynamicStoreDomainState, SCNetworkInterfaceGetBSDName(interface), kSCEntNetIPv4);
val = (CFDictionaryRef)SCDynamicStoreCopyValue(store, key);
NSLog(@”%@, %@, %@”, key, SCNetworkInterfaceGetInterfaceType(interface), [(NSDictionary *)val description]);
if (val != NULL)
CFRelease(val);
CFRelease(key);
}
CFRelease(serviceArray);

サンプルソースはgithubに。

以上、宿題終了・・・。

シェアする

フォローする