ホスト名から IP アドレスを取得する : Objective-C プログラミング

PROGRAM


ホスト名から IP アドレスを取得する

ホスト名を名前解決して IP アドレスを取得するには getaddrinfo 関数を使用します。

たとえば NSString 型で指定した名前から in_addr_t 型で IPv4 アドレスを取得する場合には、次のような感じになります。

// 必要なヘッダーは次のような感じです。

#import <sys/socket.h>

#import <netdb.h>

 

// 名前からアドレスを取得します。

- (in_addr_t)getAddressFromName:(NSString*)aHostName

{

in_addr_t result;

 

// NSString を C 文字列に変換するためのバッファです。WORK_BUFFER_SIZE は任意のバッファーサイズです。

char name[WORK_BUFFER_SIZE];

 

// NSString を C 文字列に変換します。

if ([aHostName getCString:name maxLength:sizeof(name) encoding: NSASCIIStringEncoding])

{

int result_code;

 

struct addrinfo* addrs;

struct addrinfo hint;

 

memset(&hint, 0, sizeof(struct addrinfo));

 

// 名前解決で取得されるアドレスは IPV4 アドレスを対象とします。

hint.ai_family = AF_INET;

hint.ai_socktype = 0;

hint.ai_protocol = 0;

hint.ai_flags = 0;

 

// 名前解決を実行して、アドレスを addrs に取得します。

result_code = getaddrinfo(name, NULL, &hint, &addrs);

 

if (result_code == 0)

{

// 今回は、見つかったアドレスの最初の 1 つを採用します。

// hint で AF_INET を指定したので、IPv4 アドレスとして処理します。

struct sockaddr_in* addr = (struct sockaddr_in*)addrs->ai_addr;

 

// アドレスデータを取得します。

result = addr->sin_addr.s_addr;

 

// 最後に getaddrinfo で取得したアドレス情報を解放します。

freeaddrinfo(addrs);

}

else

{

// 名前が存在しない場合は、今回は NSNotFound を戻り値として設定することにします。

result = NSNotFound;

}

}

else

{

// C 文字列への変換に失敗した場合の処理をここに記します。

result = NSNotFound;

}

 

return result;

}

このようにして、ホスト名から IP アドレスを取得することができました。

getaddrinfo 関数は、名前解決に失敗した場合には、戻り値として 0 以外を返すようになっています。

これは、DNS にレコードが存在しなかった場合も同様で、その場合には "EAI_NONAME" や "EAI_NODATA"、"EAI_SERVICE" といった値を返すようでした。DNS サーバーが応答しなかった場合には "EAI_FAIL" や "EAI_AGAIN" を返すそうです。

 

同じように名前解決を行う関数として gethostbyname という関数もあるようですけど、こちらは使用が推奨されていないことと、マルチスレッド等で同時実行された際に、正しい結果を返さない可能性があるらしいので、こちらの getaddrinfo を使って名前解決を行うのが良さそうです。

[ もどる ]