第92章 IPアドレスとホスト名


前章では、自分のホスト名を取得してIPアドレスに変換して表示するプログラムを示しました。

今回は、任意のホスト名から、IPアドレスを取得したり、IPアドレスからホスト名を取得するプログラムを考えます。



ホスト名からIPアドレスを取得するにはgethostbyname関数を使いましたね。 これが、HOSTENT構造体へのポインタを返しました。

逆にIPアドレスからホスト名を取得するにはgethostbyaddr関数を使います。

struct HOSTENT FAR * gethostbyaddr(
  const char FAR *addr,
  int len,
  int type
);
addrには、IPアドレスを指定します。
(注:直接"192.168.0.10"などと指定するのではなくinet_addr関数で変換したものを使う)

lenには、アドレスのサイズ(4バイトなので4を指定)

typeは、アドレスタイプです(AF_INET)。

成功するとHOSTENT構造体へのポインタを返します。失敗したときはNULLが返されます。

さて、inet_addr関数は次のようになっています。

unsigned long inet_addr(
  const char   FAR *cp  
);
cpには、IPアドレスを表す"192.168.0.55"などのような文字列を指定します。

では、プログラムを見てみましょう。

// getip02.c

#include <stdio.h>
#include <winsock.h>

int getip();
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.IPアドレスの取得\n");
        printf("2.ホスト名の取得\n");
        printf("0.終了\n");
        printf("------------------\n");
        printf("選択:");
        gets(szAns);
        switch (szAns[0]) {
            case '0':
                loop = 0;
                break;
            case '1':
                getip();
                break;
            case '2':
                gethost();
                break;
            default:
                printf("入力エラー\n");
                break;
        }
        if (loop == 0)
            break;
    }
    WSACleanup();
    return 0;
}

int getip()
{
    char szHost[256], szIP[256];
    HOSTENT *lpHost;
    IN_ADDR inaddr;

    printf("ホスト名---");
    gets(szHost);
    lpHost = gethostbyname(szHost);
    if (lpHost == NULL) {
        printf("IPアドレス取得失敗\n");
        return -1;
    }
    memcpy(&inaddr, lpHost->h_addr_list[0], 4);
    strcpy(szIP, inet_ntoa(inaddr));
    printf("IP = %s\n", szIP);

    return 0;
}

int gethost()
{
    char szIP[256], szHost[256];
    HOSTENT *lpHost;
    int addr;

    printf("IPアドレス---");
    gets(szIP);
    addr = inet_addr(szIP);
    lpHost = gethostbyaddr((char *)&addr, 4, AF_INET);
    if (lpHost == NULL) {
        printf("ホスト名取得失敗\n");
        return -2;
    }
    printf("ホスト名---%s\n", lpHost->h_name);
    return 0;
}

パーソナル・ファイヤー・ウォールとかウィルスチェックのプログラムが動いている 環境では、うまく動作しない可能性があります。
[Index][総合Index] [Previous Chapter] [Next Chapter]

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