第97章 ネットワーク内のホストを列挙する


今回は、第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.」というように最後にピリオドを付けても 正しく動作するようにしてあります。 文字列を数値に直したり、その逆をしたりしているだけですね。

いろいろ改良してみてください。




[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/30/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。