【C言語】ホスト名からIPアドレスを取得する方法を解説

この記事では、C言語を使用してホスト名からIPアドレスを取得する方法を解説します。

目次から探す

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

ネットワークプログラミングにおいて、ホスト名からIPアドレスを取得する方法は非常に重要です。

C言語では、いくつかの方法があります。

以下では、代表的な3つの方法を紹介します。

方法1: gethostbyname関数を使用する方法

gethostbyname関数は、ホスト名を引数として受け取り、そのホスト名に対応するIPアドレスを返す関数です。

以下に、gethostbyname関数を使用してホスト名からIPアドレスを取得するサンプルコードを示します。

#include <stdio.h>
#include <netdb.h>
int main() {
    char hostname[] = "example.com";
    struct hostent *host;
    host = gethostbyname(hostname);
    if (host == NULL) {
        printf("ホスト名の解決に失敗しました。\n");
    } else {
        printf("ホスト名: %s\n", host->h_name);
        printf("IPアドレス: %s\n", inet_ntoa(*((struct in_addr *)host->h_addr)));
    }
    return 0;
}

上記のコードでは、example.comというホスト名に対応するIPアドレスを取得しています。

gethostbyname関数は、成功した場合にはstruct hostent型のポインタを返し、その中にホスト名やIPアドレスなどの情報が格納されています。

方法2: getaddrinfo関数を使用する方法

getaddrinfo関数は、ホスト名やサービス名を引数として受け取り、その情報に基づいてIPアドレスやポート番号などの情報を取得する関数です。

以下に、getaddrinfo関数を使用してホスト名からIPアドレスを取得するサンプルコードを示します。

#include <stdio.h>
#include <netdb.h>
int main() {
    char hostname[] = "example.com";
    struct addrinfo hints, *res;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    if (getaddrinfo(hostname, NULL, &hints, &res) != 0) {
        printf("ホスト名の解決に失敗しました。\n");
    } else {
        struct sockaddr_in *addr = (struct sockaddr_in *)res->ai_addr;
        printf("ホスト名: %s\n", hostname);
        printf("IPアドレス: %s\n", inet_ntoa(addr->sin_addr));
    }
    return 0;
}

上記のコードでは、example.comというホスト名に対応するIPアドレスを取得しています。

getaddrinfo関数は、成功した場合にはstruct addrinfo型のポインタを返し、その中にIPアドレスなどの情報が格納されています。

方法3: DNSクエリを送信する方法

ホスト名からIPアドレスを取得するもう一つの方法は、DNSクエリを直接送信する方法です。

この方法では、ソケットを作成し、DNSサーバに対してクエリを送信してIPアドレスを取得します。

以下に、DNSクエリを送信してホスト名からIPアドレスを取得するサンプルコードを示します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int main() {
    char hostname[] = "example.com";
    struct sockaddr_in server;
    struct hostent *host;
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        printf("ソケットの作成に失敗しました。\n");
        return 1;
    }
    host = gethostbyname(hostname);
    if (host == NULL) {
        printf("ホスト名の解決に失敗しました。\n");
        return 1;
    }
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(53);
    server.sin_addr = *((struct in_addr *)host->h_addr);
    if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
        printf("接続に失敗しました。\n");
        return 1;
    }
    // DNSクエリの送信と受信処理を実装する
    close(sock);
    return 0;
}

上記のコードでは、example.comというホスト名に対応するIPアドレスを取得するために、DNSクエリを送信する準備を行っています。

具体的なDNSクエリの送信と受信処理は、実装する必要があります。

以上が、C言語でホスト名からIPアドレスを取得する方法の解説です。

それぞれの方法には特徴や利点がありますので、目的や環境に応じて適切な方法を選択してください。

目次から探す