DNS(ドメインネームサービス)

ホストのドメイン名を与えて,IPアドレスを受け取ります。このプログラムでは見えないけれど,舞台裏でDNSサーバにアクセスして,ドメイン名→IPアドレス変換を行なっています。

dns.c

/**********************************************************************
Winsock2を用いたDNSサンプルプログラム
このサンプルプログラムはDNSサーバにドメイン名を与えてエイリアスとIPア
ドレスをリプライさせます。
エイリアスとは,ホストの持つ別名のことです。
(1)DNSサーバはWindowsシステムに登録されているものを使います。
(2)コンパイル時に「ws2_32.lib」をリンクしてください。
**********************************************************************/

/*const char *hostname="aaaa.tokyo-ct.ac.jp";*/
/*const char *hostname="ybbsmtp.mail.yahoo.co.jp";*/
const char *hostname="www.tokyo-ct.ac.jp";

/* Import Library: Link with ws2_32.lib */
#include <stdio.h>
#include <string.h>
#include <winsock2.h>

int getIPaddress(const char *host)
{
    WSADATA wsaData; /*winsock*/
    LPHOSTENT lpHost;
    int status;
    int i;

    /*winsockをver1.1で初期化を要求*/
    status=WSAStartup(MAKEWORD(1, 1), &wsaData);
    if (status != 0) {
        fprintf(stderr,"WSAStartup() failed\n");
        return INVALID_SOCKET;
    }

    /*ホスト名からホストの情報を得る*/
    lpHost = gethostbyname(host);
    if(lpHost == NULL) {
        fprintf(stderr,"host name error\n");
        WSACleanup();
        return INVALID_SOCKET;
    }
    printf("host name      = %s\n" , lpHost->h_name);
    /*printf("address type   = %d\n" , lpHost->h_addrtype);*/ /*AF_INETは2*/
    /*printf("address length = %d\n" , lpHost->h_length);*/
    for(i = 0 ; lpHost->h_aliases[i] ; i++) {
        printf("aliases        = %s\n" , lpHost->h_aliases[i]);
    }

    for(i = 0 ; lpHost->h_addr_list[i] ; i++) {
        IN_ADDR *ip;
        ip = (IN_ADDR *)lpHost->h_addr_list[i];
        printf("IP address     = %s\n" , inet_ntoa(*ip));
    }
    printf("\n");

    WSACleanup();
    return 0;
}

int main()
{
    getIPaddress(hostname);
    return 0;
}