ホスト名から 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 を使って名前解決を行うのが良さそうです。
[ もどる ]