LAN内に多数のパソコンがつながっている時、IPアドレスとコンピュータ名 の一覧を自動的に作ってくれるソフトがあると便利です。
通常LAN内のパソコンにはには192.168.x.yという形のIPアドレスが降られていることが 多いです(クラスC)。また、xは固定で、yが1から254までになっていることが多いです。 そこで、192.168.0.1から192.168.0.25までのパソコンのホスト名を調べるようなプログラムが あると便利ですね。
では、さっそくプログラムを見てみましょう。
当然プロジェクトにはWSock32.Libが加わっていなくてはなりません。
// ip01.c #include <stdio.h> #include <winsock.h> int gethost(); int main() { WSADATA wsaData; char szAns[8]; int loop = 1;//1:ループを回る 0:ループを出る WSAStartup(MAKEWORD(1, 1), &wsaData); while (1) { printf("------------------\n"); printf("1.ホスト名の取得\n"); printf("0.終了\n"); printf("------------------\n"); printf("選択:"); gets(szAns); switch (szAns[0]) { case '0': loop = 0; break; case '1': gethost(); break; default: printf("入力エラー\n"); break; } if (loop == 0) break; } WSACleanup(); return 0; } int gethost() { char szIP3[256], szIPstart[16], szIPend[16], szIP[256], szEnd[16]; HOSTENT *lpHost; int addr, n, i; printf("IPアドレス上位3バイト(例: 192.168.0)---"); gets(szIP3); printf("開始IPアドレス下位1バイト(例: 1)---"); gets(szIPstart); printf("終了IPアドレス下位1バイト(例: 10)--"); gets(szIPend); n = atoi(szIPend) - atoi(szIPstart) + 1; if (n <= 0) { printf("指定が不正です\n"); return -1; } for (i = 0; i < n; i++) { strcpy(szIP, szIP3); if (szIP3[strlen(szIP3)-1] != '.') strcat(szIP, "."); itoa(atoi(szIPstart) + i, szEnd, 10); strcat(szIP, szEnd); addr = inet_addr(szIP); lpHost = gethostbyaddr((char *)&addr, (int)sizeof(addr), AF_INET); if (lpHost == NULL) { printf("ホスト名取得失敗(%s)\n", szIP); continue; } printf("%s---%s\n", szIP, lpHost->h_name); } return 0; }これは、特に説明は不要ですね。
では、実行結果を見てみましょう。
上位3バイトを指定する時「192.168.0.」というように最後にピリオドを付けても 正しく動作するようにしてあります。 文字列を数値に直したり、その逆をしたりしているだけですね。
いろいろ改良してみてください。
Update Mar/30/2004 By Y.Kumei