. [C언어, 웹서버] HostInfo
본문 바로가기
프로그래밍 공부/CSPP

[C언어, 웹서버] HostInfo

by 불냥이_ 2021. 1. 24.
#include "csapp.h"

int main(int argc, char **argv)
{
    struct addrinfo *p, *listp, hints;
    char buf[MAXLINE];
    int rc, flags;

    if (argc != 2)
    {
        fprintf(stderr, "usage: %s <domain name>\n", argv[0]);
        exit(0);
    }

    /* Get a list of addrinfo records */
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET;       /* IPv4 only */
    hints.ai_socktype = SOCK_STREAM; /* Connections only */
    if ((rc = getaddrinfo(argv[1], NULL, &hints, &listp)) != 0)
    {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(rc));
        exit(1);
    }

    /* Walk the list and display each IP address */
    flags = NI_NUMERICHOST; /* Display address string instead of domain name */
    for (p = listp; p; p = p->ai_next)
    {
        Getnameinfo(p->ai_addr, p->ai_addrlen, buf, MAXLINE, NULL, 0, flags);
        printf("%s\n", buf);
    }

    /* Clean up */
    Freeaddrinfo(listp);

    exit(0);
    34
}

 HOSTINFO는 도메인이름과 여기에 연관된 IP 주소로의 매핑을 출력한다. 

 

 9~12번 줄 : 만약 argument가 2개가 아니라는 것은 잘못된 입력이 들어왔다는 것이므로 에러를 출력하자. 

 

 14~20번 줄 : hints 구조체에 원하는 소통 방식을 입력하고, getaddrinfo를 실행하여 도메인을 ip주소로 변환한다. (이 단계에서는 딱히 서비스를 사용하지 않고, getaddrinfo 기능 중에 도메인을 ip주소로 변환하는 기능만 사용할 것이기 때문에 포트 번호 (포트 번호는 서비스 종류를 의미한다.) 는 NULL로 입력해준다.)

 

 23~28번 줄 : 우리는 getaddrinfo를 통해 해당 도메인이 가지고 있는 ip주소를 addrinfo 구조체에 담도록 했다. 도메인이 하나이더라도 ip 주소는 여러 개일 수 있기 때문에 addrinfo도 여러 개가 될 수 있다. 

 

 네이버로 한번 실습 해보자.

그림 1. naver.com의 IP주소

4개의 IP가 뜬 것이 보인다.

 

 이로서 hostinfo를 완성해보았다. 

댓글