この記事では、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アドレスを取得することができますので、目的や環境に応じて適切な方法を選択してください。