今回は、第92章の改良版を作ります。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