今回は、第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