linux man page : getaddrinfo - ³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸¸¦ °¡Á®¿Â´Ù.
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

getaddrinfo

³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸¸¦ °¡Á®¿Â´Ù.

»ç¿ë ¹ý

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
 
int getaddrinfo(const char *node, const char *service, 
                const struct addrinfo *hints, 
                struct addrinfo **res); 
 
void freeaddrinfo(struct addrinfo *res); 
 

¸Å°³ º¯¼ö

  • node : È£½ºÆ® À̸§
  • service : ¼­ºñ½º À̸§
  • hints : addrinfo ±¸Á¶Ã¼¸¦ ä¿ö¼­ ³Ñ±â¸é, ÀÌ ÇÔ¼ö´Â addrinfo ±¸Á¶Ã¼ÀÇ ¸â¹ö º¯¼ö °ªÀ» Àо, ÀÌ¿¡ ´ëÇÑ ÁÖ¼Ò Á¤º¸¸¦ ³Ñ±ä´Ù.
  • res : ÈùÆ® °ªÀ» Âü°íÇØ¼­ °¡Á®¿Â ³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸´Â res¸¦ ÅëÇØ¼­ °¡Á®¿Ã ¼ö ÀÖ´Ù.

¼³¸í

ÀÌ ÇÔ¼ö´Â node¿Í serviceÁ¤º¸¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍ³Ý È£½ºÆ®¿Í ¼­ºñ½º¿¡ ´ëÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ÁÖ¼Ò Á¤º¸¸¦ ´ã°í ÀÖ´Â, addrinfo ±¸Á¶Ã¼ÀÇ ¸ñ·ÏÀ» ¹ÝȯÇÑ´Ù. addrinfo ±¸Á¶Ã¼´Â ÇØ´ç È£½ºÆ®¿Í ¼­ºñ½º¿¡ ´ëÀÀµÇ´Â ÁÖ¼Ò Á¤º¸¸¦ Æ÷ÇÔÇÑ´Ù. À̵é ÁÖ¼Ò Á¤º¸´Â bind(2)¿Í connect(2)µîÀÇ ÇÔ¼ö¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

addrinfo ±¸Á¶Ã¼
struct addrinfo { 
    int              ai_flags; 
    int              ai_family; 
    int              ai_socktype; 
    int              ai_protocol; 
    size_t           ai_addrlen; 
    struct sockaddr *ai_addr; 
    char            *ai_canonname; 
    struct addrinfo *ai_next; 
}; 
 
  • ai_family : ÁÖ¼Ò ¿µ¿ª °ªÀ» °¡Áø´Ù. AF_INET¿Í AF_INET6 °¡ »ç¿ëµÈ´Ù. node¿Í service°¡ IPv4 ÁÖ¼Ò¿µ¿ªÀ̶ó¸é AF_INET, IPv6 ÁÖ¼Ò¿µ¿ªÀ̶ó¸é AF_INET6À» ¼³Á¤ÇÑ´Ù. ¸¸¾à AF_UNSPEC°¡ ¼³Á¤µÇ¸é ¸ðµç ÁÖ¼Ò ¿µ¿ªÀÇ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù.
  • ai_socktype : ¼ÒÄÏ Çü½Ä°ªÀ» °¡Áø´Ù. SOCK_STREAM ȤÀº SOCK_DGRAMÀÌ ÁöÁ¤µÈ´Ù. ¸¸¾à 0À» ÁöÁ¤ÇÏ¸é ¸ðµç Á¾·ùÀÇ ¼ÒÄÏ Çü½Ä¿¡ ´ëÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù.
  • ai_protocol : ¼ÒÄÏ ÁÖ¼Ò°¡ »ç¿ëÇÏ´Â ÇÁ·ÎÅäÄÝ
  • ai_flags : Ãß°¡ ¿É¼Ç

¹Ýȯ °ª

ÀÌ ÇÔ¼ö´Â ¼º°øÇϸé 0, ½ÇÆÐÇϸé 0ÀÌ ¾Æ´Ñ °ªÀ» ¹ÝȯÇÑ´Ù.

¿¹Á¦

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 
 
 
int main(int argc, char **argv) 
{ 
        struct addrinfo hints; 
        struct addrinfo *result, *rp; 
        struct sockaddr_in *sin; 
        struct sockaddr_in6 *sin6; 
        int *listen_fd; 
        int listen_fd_num=0; 
 
        char buf[80] = {0x00,}; 
        int i = 0; 
        if(argc != 2) 
        { 
                printf("Usage : %s [port]\n", argv[0]); 
                return 1; 
        } 
 
        memset(&hints, 0x00, sizeof(struct addrinfo)); 
 
        hints.ai_flags = AI_PASSIVE; 
        hints.ai_family = AF_UNSPEC; 
        hints.ai_socktype = SOCK_STREAM; 
 
        if(getaddrinfo(NULL, argv[1], &hints, &result) != 0 ) 
        { 
                perror("getaddrinfo"); 
                return 1; 
        } 
 
        for(rp = result ; rp != NULL; rp = rp->ai_next) 
        { 
                listen_fd_num++; 
        } 
        listen_fd = malloc(sizeof(int)*listen_fd_num); 
 
        printf("Num %d\n", listen_fd_num); 
        for(rp = result, i=0 ; rp != NULL; rp = rp->ai_next, i++) 
        { 
                if(rp->ai_family == AF_INET) 
                { 
                        sin = (void *)rp->ai_addr; 
                        inet_ntop(rp->ai_family, &sin->sin_addr, buf, sizeof(buf)); 
                        printf("<bind Á¤º¸ %d %d %s>\n", rp->ai_protocol, rp->ai_socktype, buf); 
                } 
                else if(rp->ai_family == AF_INET6) 
                { 
                        sin6 = (void *)rp->ai_addr; 
                        inet_ntop(rp->ai_family, &sin6->sin6_addr, buf, sizeof(buf)); 
                        printf("<bind Á¤º¸ %d %d %s>\n", rp->ai_protocol, rp->ai_socktype, buf); 
                } 
                if((listen_fd[i] = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol)) < 0) 
                { 
                        printf("Socket Create Error\n"); 
                } 
                if(rp->ai_family == AF_INET6) 
                { 
                        int opt = 1; 
                        setsockopt(listen_fd[i], IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, sizeof(opt)); 
                } 
 
                if(bind(listen_fd[i], rp->ai_addr, rp->ai_addrlen) != 0) 
                { 
                        if(errno != EADDRINUSE); 
                        { 
                                perror("bind error\n"); 
                                return 1; 
                        } 
                } 
                if(listen(listen_fd[i], 5) != 0) 
                { 
                        perror("listen error\n"); 
                        return 1; 
                } 
        } 
        freeaddrinfo(result); 
        pause(); 
        return 1; 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.