Linux

[Linux, C] IP주소와 도메인네임을 서로 치환하는 프로그램 TCP/IP통신

반나무 2020. 9. 7. 15:35
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(int argc, char **argv){

        struct hostent *host;
        struct sockaddr_in addr;
        int i;
		
        // 메모리 초기화
        memset(&addr, '0', sizeof(addr));
		
        // 인자 수 체크
        if(argc!=2){
                printf("Please, Input IP Address or Domain Name \n");
                exit(1);
        }
	
    	// 32비트 IPv4주소를 넣을 수있다. inet_addr()를 통해 32비트 변환
        addr.sin_addr.s_addr=inet_addr(argv[1]);
        
        // addr : inet_addr()한수를 이용해 변환된 IP주소가 전달되어있는 in_addr 구조체 변수 포인터
        // lend : 입력되는 주소의 길이 IPv4=4 IPv6=16
        // type : 입력되는 주소의 타입 AF_INET=IPv4 , AF_INET6=IPv6
        host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);

        if(host){
                printf("DOMAIN NAME : %s \n\n", host->h_name);
        } else {
                host = gethostbyname(argv[1]);
                if(host){
                        printf("IP ADDRESS TYPE : %s \n", host->h_addrtype==AF_INET?"IPv4":"IPv6");
                        printf("IP ADDRESS >>>> \n");

                        for(i=0; host->h_addr_list[i]; i++){
                                puts(inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
                        }
                        fputc('\n', stdout);
                } else {
                        printf("Get Host Error\n");
                }
        }

        return 0;
}     

 

* 소켓주소구조체 : IP주소화 port번호는 구조체 변수에 담아서 표현한다.

struct sockaddr_in { 
        sa_family_t sa_family;         // 주소체계
        uint16_t sin_port;             // 포트번호
        struct in_addr sin_addr;       // 32비트 주소
        struct in_addr {                   
                uint32_t s_addr; 
        } 
        //char sin_zero[8];            // 요즘 사용되지않음
};

struct hostent {
        char *h_name;           // 공식 도메인 네임
        char **h_aliases;       // 비공식 도메인 네임(별명)
        int h_addrtype;         // 주소 정보체계 (IPv4: AF_INET, IPv6: AF_INET6)
        int h_length;           // return IP정보의 크기 (IPv4 : 4, IPv6 : 6)
        char **h_addr_list;     // IP의 주소정보, 둘 이상의 경우 모두 반환
};

 

반응형