C++
 Computer >> コンピューター >  >> プログラミング >> C++

C言語でローカルコンピュータのIPアドレスとホスト名を取得する方法


この記事では、C言語を使ってローカルコンピュータのホスト名とIPアドレスを簡単に取得する方法を解説します。実際に動作するサンプルプログラムを作成しながら、具体的な手順を見ていきましょう。

ここでは主に以下の3つの関数を使用します。それぞれ役割が異なるため、まずは各関数の概要を確認しておきましょう。

番号関数と説明
1gethostname()
ローカルコンピュータの標準ホスト名を取得します。
2gethostbyname()
ホストデータベースから、指定したホスト名に対応するホスト情報を検索します。
3inet_ntoa()
IPv4のネットワークアドレスを「192.168.1.1」のようなドット区切りの10進数形式のASCII文字列に変換します。

サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void check_host_name(int hostname) { // ホスト名の取得結果をチェックする関数
    if (hostname == -1) {
        perror("gethostname");
        exit(1);
    }
}

void check_host_entry(struct hostent *hostentry) { // ホスト名からホスト情報を検索
    if (hostentry == NULL) {
        perror("gethostbyname");
        exit(1);
    }
}

void IP_formatter(char *IPbuffer) { // IP文字列が正しく取得できたかチェック
    if (NULL == IPbuffer) {
        perror("inet_ntoa");
        exit(1);
    }
}

main() {
    char host[256];
    char *IP;
    struct hostent *host_entry;
    int hostname;

    hostname = gethostname(host, sizeof(host)); // ホスト名を取得
    check_host_name(hostname);

    host_entry = gethostbyname(host); // ホスト情報を検索
    check_host_entry(host_entry);

    IP = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0])); // IPアドレスを文字列に変換

    printf("Current Host Name: %s\n", host);
    printf("Host IP: %s\n", IP);
}

実行結果

Current Host Name: soumyadeep-VirtualBox
Host IP: 127.0.1.1

コードのポイントと補足

  • 処理の流れ:まずgethostname()でホスト名を取得し、次にgethostbyname()でそのホスト名に対応するアドレス情報を取得します。最後にinet_ntoa()でバイナリ形式のIPアドレスを人間が読める文字列へ変換しています。
  • エラーチェック:各関数の戻り値を必ずチェックし、失敗した場合はperror()でエラー内容を表示して終了する構造になっています。
  • コンパイル方法:Linux環境では「gcc sample.c -o sample」のようにコンパイルし、「./sample」で実行できます。
  • 127.0.1.1について:Debian系ディストリビューション(Ubuntuなど)では、/etc/hosts の設定によりホスト名がループバック系のアドレスにマッピングされているため、このように表示されます。
  • 注意点:gethostbyname()は歴史のあるAPIですが、現在は非推奨とされています。実用的な開発では、スレッドセーフなgetaddrinfo()の利用が推奨されます。
  1. C++とOpenCVで動画の現在のフレーム位置を取得する方法

    「現在のフレーム」とは、動画を再生している際に画面に表示されているフレームのことを指します。これは「アクティブフレーム」とも呼ばれます。多くのアプリケーション開発では、現在表示中のフレーム番号を取得する必要が生じることがあります。OpenCVのVideoCaptureクラスには、CAP_PROP_POS_FRAMESプロパティを指定してget()メソッドを呼び出すことで、現在のフレーム位置(0から始まるインデックス)を取得する機能が用意されています。以下のプログラムは、動画の現在のフレーム位置を読み取り、コンソールウィンドウに表示します。サンプルコード#include<opencv2/o

  2. C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説

    OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。 「at」メソッドでピクセル値を取得する まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。 サンプルコード #include<iostream> #include<opencv2/highgui/highgui.hpp> using namespace std;