C言語でローカルコンピュータのIPアドレスとホスト名を取得する方法
この記事では、C言語を使ってローカルコンピュータのホスト名とIPアドレスを簡単に取得する方法を解説します。実際に動作するサンプルプログラムを作成しながら、具体的な手順を見ていきましょう。
ここでは主に以下の3つの関数を使用します。それぞれ役割が異なるため、まずは各関数の概要を確認しておきましょう。
| 番号 | 関数と説明 |
|---|---|
| 1 | gethostname() ローカルコンピュータの標準ホスト名を取得します。 |
| 2 | gethostbyname() ホストデータベースから、指定したホスト名に対応するホスト情報を検索します。 |
| 3 | inet_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()の利用が推奨されます。
-
C++とOpenCVで動画の現在のフレーム位置を取得する方法
「現在のフレーム」とは、動画を再生している際に画面に表示されているフレームのことを指します。これは「アクティブフレーム」とも呼ばれます。多くのアプリケーション開発では、現在表示中のフレーム番号を取得する必要が生じることがあります。OpenCVのVideoCaptureクラスには、CAP_PROP_POS_FRAMESプロパティを指定してget()メソッドを呼び出すことで、現在のフレーム位置(0から始まるインデックス)を取得する機能が用意されています。以下のプログラムは、動画の現在のフレーム位置を読み取り、コンソールウィンドウに表示します。サンプルコード#include<opencv2/o
-
C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説
OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。 「at」メソッドでピクセル値を取得する まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。 サンプルコード #include<iostream> #include<opencv2/highgui/highgui.hpp> using namespace std;