【C言語】PCのIPアドレスを取得する方法を3つ解説

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

目次から探す

IPアドレスの取得方法

インターネットに接続されたデバイスは、一意のIPアドレスを持っています。

C言語を使用して、PCのIPアドレスを取得する方法を解説します。

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

gethostname関数は、ホスト名を取得するための関数です。

ホスト名は、ネットワーク上で一意の名前であり、IPアドレスと関連付けられています。

以下のサンプルコードを使用して、gethostname関数を使ってIPアドレスを取得する方法を説明します。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main() {
    char hostname[256];
    struct hostent *host;
    struct in_addr **addr_list;
    // ホスト名を取得
    if (gethostname(hostname, sizeof(hostname)) == -1) {
        perror("gethostname");
        return 1;
    }
    // ホスト情報を取得
    host = gethostbyname(hostname);
    if (host == NULL) {
        perror("gethostbyname");
        return 1;
    }
    // IPアドレスを取得
    addr_list = (struct in_addr **)host->h_addr_list;
    for (int i = 0; addr_list[i] != NULL; i++) {
        printf("IPアドレス: %s\n", inet_ntoa(*addr_list[i]));
    }
    return 0;
}

上記のコードでは、gethostname関数を使用してホスト名を取得し、gethostbyname関数を使用してホスト情報を取得しています。

そして、取得したホスト情報からIPアドレスを取得して表示しています。

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

getaddrinfo関数は、ホスト名やサービス名からIPアドレスやポート番号を取得するための関数です。

以下のサンプルコードを使用して、getaddrinfo関数を使ってIPアドレスを取得する方法を説明します。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main() {
    struct addrinfo hints, *res, *p;
    char ipstr[INET6_ADDRSTRLEN];
    // ヒントを初期化
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC; // IPv4またはIPv6
    hints.ai_socktype = SOCK_STREAM; // TCP
    // ホスト名を解決
    if (getaddrinfo("localhost", NULL, &hints, &res) != 0) {
        perror("getaddrinfo");
        return 1;
    }
    // 取得したIPアドレスを表示
    for (p = res; p != NULL; p = p->ai_next) {
        void *addr;
        char *ipver;
        // IPv4の場合
        if (p->ai_family == AF_INET) {
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
            addr = &(ipv4->sin_addr);
            ipver = "IPv4";
        }
        // IPv6の場合
        else {
            struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
            addr = &(ipv6->sin6_addr);
            ipver = "IPv6";
        }
        // IPアドレスを文字列に変換
        inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
        printf("%s: %s\n", ipver, ipstr);
    }
    freeaddrinfo(res);
    return 0;
}

上記のコードでは、getaddrinfo関数を使用してホスト名を解決し、取得したIPアドレスを表示しています。

IPv4とIPv6の両方に対応しています。

方法3: ioctl関数を使用する

ioctl関数は、デバイスに対して制御コマンドを送信するための関数です。

ネットワークインターフェースに対してioctl関数を使用してIPアドレスを取得することができます。

以下のサンプルコードを使用して、ioctl関数を使ってIPアドレスを取得する方法を説明します。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
    int fd;
    struct ifreq ifr;
    // ソケットを作成
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd == -1) {
        perror("socket");
        return 1;
    }
    // ネットワークインターフェースの情報を取得
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
    if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) {
        perror("ioctl");
        close(fd);
        return 1;
    }
    // IPアドレスを取得
    struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_addr;
    char ipstr[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(addr->sin_addr), ipstr, INET_ADDRSTRLEN);
    printf("IPアドレス: %s\n", ipstr);
    close(fd);
    return 0;
}

上記のコードでは、ioctl関数を使用してネットワークインターフェースの情報を取得し、その中からIPアドレスを取得して表示しています。

以上が、C言語を使用してPCのIPアドレスを取得する方法の解説です。

それぞれの方法でIPアドレスを取得することができますので、目的や環境に応じて適切な方法を選択してください。

目次から探す