tonykang22 / study

0 stars 0 forks source link

[리눅스 개발환경] 19. 주소 변환 #90

Open tonykang22 opened 2 years ago

tonykang22 commented 2 years ago

19. 주소 변환

주소 변환 관련 주요 함수들




#include <netdb.h>

extern int h_errno;
struct hostent *gethostbyname(const char *name);


#include <sys/socket.h>     /* for AF_INET */

struct hostent *gethostbyaddr(cont void *addr, socklen_t len, int type);




gethostbyname 예제

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
        struct hostent *hp = NULL;
        int i;

        if (argc < 2) {
                printf("Usage: %s <hostname>\n", argv[0]);
                exit(EXIT_FAILURE);
        }

        hp = gethostbyname(argv[1]);
        if (!hp) {
                printf("gethostbyname error: %s\n", hstrerror(h_errno));
                return 0;
        }

        printf("h_name: %s\n", hp->h_name);
        printf("h_length: %d\n", hp->h_length);

        for (i = 0; i < hp->h_length && hp->h_addr_list[i]; i++) {
                char *addr = (char*)hp->h_addr_list[i];
                struct in_addr *in = (struct in_addr*)addr;
                printf("h_addr_list[%d]: %s\n", i, inet_ntoa(*in));
        }

        return 0;
}




getaddrinfo(), getnameinfo()

struct addrinfo {
        int ai_flags;
        int ai_family;
        int ai_socktype;
        int ai_protocol;
        socklen_t ai_addrlen;
        struct sockaddr* ai_addr;
        char* ai_canonname;          /* canocical name */
        struct addrinfo* ai_next;    /* this struct can form a linked list */
};


#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int getaddrinfo(const char* hostname,
            const char* service,
            const struct addrinfo* hints,
            struct addrinfo** res);



#include <sys/socket.h> 
#include <netdb.h>

int getnameinfo(const struct sockaddr* sa, socklen_t salen, 
                char* host, size_t hostlen,
                char* serv, size_t servlen, 
                int flags);

freeaddrinfo()

#include <sys/socket.h> 
#include <netdb.h>

void freeaddrinfo(struct addrinfo *ai);



주소 변환 실습

#include <stdio.h> 
#include <stdlib.h> 
#include <netdb.h> 
#include <netinet/in.h> 
#include <sys/socket.h>

#ifndef NI_MAXHOST 
#define NI_MAXHOST 1025 
#endif

int main(int argc, char *argv[]) 
{
    struct addrinfo* result; 
    struct addrinfo* res; 
    int error;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <domain name, ex. www.example.com>\n", argv[0]); 
        exit(EXIT_FAILURE);
    }

    /* resolve the domain name into a list of addresses */ 
    error = getaddrinfo(argv[1], NULL, NULL, &result);
    if (error != 0) {
        if (error == EAI_SYSTEM) { 
            perror("getaddrinfo");
        } else {
            fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
        }
        exit(EXIT_FAILURE); 
    }

    /* loop over all returned results and do inverse lookup */ 
    for (res = result; res != NULL; res = res->ai_next) {
        char hostname[NI_MAXHOST];
        error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0); 
        if (error != 0) {
            fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error));
            continue; 
        }
    if (*hostname != '\0') 
        printf("hostname: %s\n", hostname);
    }

    freeaddrinfo(result);
    return 0; 
}