ネットワークインターフェイスの情報を取得する : Objective-C プログラミング
PROGRAM
ネットワークインターフェイスの情報を取得する
搭載されているネットワークインターフェイスの IP アドレスやインターフェイス名といった情報は、getifaddrs 関数を使用して取得することができるようになっています。
とりあえず、以下では雰囲気を紹介する感じで、インターフェイスを取得するメソッドを記載してみます。取得したアドレスを使って何かをするようなプログラムにはなっていないので、取得した情報を踏まえて、適宜処理を加えてみてください。
// 必要なヘッダーは次のような感じです。
#import <ifaddrs.h>
#import <sys/socket.h>
#import <arpa/inet.h>
// 存在しているネットワークインターフェイスの一覧を取得します。
- (void)getNetworkInterfaces
{
struct ifaddrs* interfaces;
// 存在するネットワークインターフェイスを取得します。
if (getifaddrs(&interfaces) == 0)
{
const struct ifaddrs* p;
// ネットワークインターフェイスの数だけ処理を繰り返します。最後の情報の ifa_next には NULL が入ります。
for (p = interfaces; p != NULL; p = p->ifa_next)
{
// ここで、個々のインターフェイス情報を取得します。
// 例えば、"en0" などのインターフェイス名を NSString 型で取得するには次のようにします。
NSString* name = [NSString stringWithCString:p->ifa_name encoding:NSUTF8StringEncoding];
NSLog(@"I/F: %@", name);
// 例えば、アドレスが IPv4 であれば、その情報をログに出力します。
if (p->ifa_addr != NULL && p->ifa_addr->sa_family == AF_INET)
{
char addrstr[INET_ADDRSTRLEN];
struct sockaddr_in* addr = (struct sockaddr_in*)p->ifa_addr;
inet_ntop(AF_INET, &addr->sin_addr, addrstr, sizeof(addrstr));
NSLog(@"IP Address: %s", addrstr);
}
// ネットマスクについても同様に取得できます。
if (p->ifa_netmask != NULL && p->ifa_netmask->sa_family == AF_INET)
{
char addrstr[INET_ADDRSTRLEN];
struct sockaddr_in* addr = (struct sockaddr_in*)p->ifa_netmask;
inet_ntop(AF_INET, &addr->sin_addr, addrstr, sizeof(addrstr));
NSLog(@"Netmask: %s", addrstr);
}
}
// 最後に、getifaddrs で取得したネットワークインターフェイスの情報を解放します。
freeifaddrs(interfaces);
}
else
{
// ネットワークインターフェイス情報の取得に失敗した場合の処理をここに記します。
}
}
getifaddrs 関数を呼び出すと、存在するインターフェイスの情報が struct ifaddrs 型で取得できます。
インターフェイスが複数ある場合には struct ifaddrs 型の ifa_next に次のインターフェイスの情報が保存された struct ifaddrs を辿ることができるので、それが NULL になるまで、アドレス情報を辿って行きます。
最後に freeifaddrs 関数を使用して、取得した struct ifaddrs を解放して、プログラムの流れとしては終了です。
[ もどる ]