名前解決の方法

ネットワークトピックの第一弾は、簡単なハウツーものからスタートです。

名前解決とは www.yahoo.com とか www.microsoft.com などの名前から、IP アドレスを取得する作業のことを指します。通常は DNS サーバや HOSTS ファイルを利用して IP アドレスを取得します (あるいは Windows ネットワークであればマシン名から IP アドレスを取得するために LMHOSTS が使われる場合もあります。あ、あと WINS サーバーもまだ現役かもしれないですね)。

この作業は古くから WinSock では gethostbyname 関数が使われてきました。現在では、getaddrinfo 関数を使うことが推奨されています。

下のコードは getaddrinfo を使って名前を解決して、情報を標準出力に返します。

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>

void main(int argc, char* argv[]) {

    INT rc;
    WSADATA wsaData;
    addrinfo hints, *pAddrInfo = NULL;
    ZeroMemory(&hints, sizeof(addrinfo));
    SOCKADDR_IN *pSockAddr_in;

    if ( argc != 2 ) {
        printf ("ex.\n mylookup www.yahoo.com\n");
        return;
    }

    // WinSock の初期化
    rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if(0 != rc) {
        printf("WSAStartup Failed.\n");
        return;
    }

    // 取得する情報を設定
    hints.ai_flags = AI_CANONNAME;
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    rc= getaddrinfo ( argv[1], "80", &hints, &pAddrInfo);
    if(0 != rc) {
        printf("getaddrinfo Failed. rc = %d (%s)\n", rc, gai_strerror(rc));
        return;
    }

    // 情報の表示
    while (1) {
        printf ("------------------------------\n");
        printf("Flags: %d\n", pAddrInfo->ai_flags);
        printf("Protocol Family: %d\n", pAddrInfo->ai_family);
        printf("Socket Type: %d\n", pAddrInfo->ai_socktype);
        printf("Protocol: %d\n", pAddrInfo->ai_protocol);
        printf("Addr Size: %d\n", pAddrInfo->ai_addrlen);
        printf("Sock Addr (0x%p)\n", pAddrInfo->ai_addr);
        pSockAddr_in = (SOCKADDR_IN*) pAddrInfo->ai_addr;
        printf("\tFamily: %d\n", pSockAddr_in->sin_family);
        printf("\tPort: %d\n", ntohs(pSockAddr_in->sin_port));
        printf("\tAddr: %s\n", inet_ntoa(pSockAddr_in->sin_addr));
        printf("Canon Name: %s\n", pAddrInfo->ai_canonname ? pAddrInfo->ai_canonname : "");
  
        if(NULL == pAddrInfo->ai_next) {
            break;
        }
        pAddrInfo = pAddrInfo->ai_next;
    }

    freeaddrinfo(pAddrInfo);
    // Cleanup WinSock
    WSACleanup();
}

IP アドレスをドット表記で表示するのは、オレンジ色でマークしたラインです。 

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説