IPv6 ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

  • ÃÖÁ¾ ¼öÁ¤ÀÏ : 2011³â 4¿ù 8ÀÏ

Contents

1 IPv6 ÇÁ·Î±×·¡¹Ö
1.1 ¼Ò°³
1.2 IPv6 Socket ÇÁ·Î±×·¡¹Ö
1.2.1 È®ÀåµÈ APIµé
1.2.2 ÀÎÅÍ³Ý ÁÖ¼Ò °ü·Ã ±¸Á¶Ã¼
1.2.3 ÀÎÅÍ³Ý ÁÖ¼Ò ¿Í ÀÎÅÍ³Ý À̸§°£ º¯È¯ ÇÔ¼öµé
1.2.4 ÀÎÅÍ³Ý ÁÖ¼Ò º¯°æÇÔ¼öµé
1.2.5 ±×¹ÛÀÇ °Íµé
1.3 IPv6 °ü·Ã ±¸Á¶Ã¼
1.4 IPv6 Áö¿øÀ» À§ÇÑ ¼ÒÄÏ API
1.4.1 ¼ÒÄÏ »ý¼º/¿¬°á°ü·Ã API
1.4.2 socket
1.4.3 bind
1.4.4 ÀÎÅÍÆäÀ̽º ÁÖ¼Ò Á¤º¸ °¡Á®¿À±â
1.4.5 listen
1.4.6 accept()
1.5 ÁÖ¼Òº¯È¯°ü·Ã API
1.5.1 inet_pton
1.5.2 inet_ntop
1.5.3 ÁÖ¼Òº¯°æ ¿¹Á¦
1.6 ipv6 ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ¿¹Á¦
1.6.1 echo ¼­¹ö
1.6.2 echo Ŭ¶óÀ̾ðÆ®
1.7 IPv6¿Í IPv4 ¸ðµÎ¿¡ ´ëÀÀÇϴ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ °³¹ß
2 °á·Ð

1 IPv6 ÇÁ·Î±×·¡¹Ö

  • ¿¹Àü Ä¿³Î 2.4.x¸¦ ±âÁØÀ¸·Î ÀÛ¼ºÇß´ø ¿À·¡µÈ ¹®¼­¸¦ ÃÖ±Ù °æÇâ¿¡ ¸ÂÃß¾î ÀçÀÛ¼º Çß½À´Ï´Ù. - 2010/5/31

1.1 ¼Ò°³

ÀÌ ±ÛÀº ¿©·¯ºÐÀÌ IPv6 ¿¡ ´ëÇÑ ±âÃÊÀûÀÎ Áö½ÄÀ» °¡Áö°í ÀÖÀ¸¸ç ¸®´ª½º »ó¿¡ IPv6 ȯ°æÀ» ¸¸µé¼ö ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡, ½ÇÁúÀûÀÎ IPv6 ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀ» °øÀ¯ÇÏ·Á°í ¸¸µé¾ú½À´Ï´Ù.

IPv6ÀÇ °³³ä°ú ¸®´ª½º»ó¿¡¼­ÀÇ IPv6 ȯ°æ±¸Ãà¿¡ ´ëÇÑ ³»¿ëÀ» ¾ÆÁ÷ ¸ð¸£°í ÀÖ´Ù¸é IPv6 ¼Ò°³¿Í IPv6 ȯ°æ ¸¸µé±â¹®¼­¸¦ ¸ÕÀú ÀÐ¾î º¸±â ¹Ù¶ø´Ï´Ù.

ÀÌ ±ÛÀº ¿©·¯ºÐÀÌ ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ Çϰí ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÀÛ¼ºÇß½À´Ï´Ù.

1.2 IPv6 Socket ÇÁ·Î±×·¡¹Ö

¿©±â¿¡¼­´Â IPv6 ¸¦ À§ÇÑ ¼ÒÄÏÁö¿ø»çÇ×°ú °ü·Ã ±¸Á¶Ã¼ Á¤º¸¿Í IPv6 ¸¦ ´Ù·ç±â À§ÇÑ ±âº»ÀûÀÎ API ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸°Ú½À´Ï´Ù. ±ÛÀº Linux Kernel 2.6.x Ubuntu 10.04À» ±âÁØÀ¸·Î Çϰí ÀÖ½À´Ï´Ù.

1.2.1 È®ÀåµÈ APIµé

±âº»ÀûÀ¸·Î IPv4, IPv6 ¸ðµÎ ±âº»ÀûÀÎ ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀº µ¿ÀÏÇÕ´Ï´Ù. µÑ´Ù BSD ¼ÒÄÏÀ» ±â¹ÝÀ¸·Î Çϰí ÀÖÀ¸¸ç, ºñ½ÁÇÑ ÇÔ¼ö¸¦ »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ´Ù¸¸ IPv6ÀÇ °æ¿ì IP ÁÖ¼Òü°èÀÇ º¯È¯°ú ±×¿¡ µû¸¥ ¸î°¡Áö ´Ù¸¥ APIµéÀÌ Á¦°øµÇ´Â Á¤µµ¿¡ Â÷À̰¡ ÀÖÀ» »ÓÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ¼ÒÄÏ »ý¼º½Ã AF_INET°¡ ¾Æ´Ñ AF_INET6¸¦ »ç¿ëÇѴٰųª bind ÇÔ¼ö È£Ãâ½Ã sockaddr_in6 ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ´Â µîÀÌ´Ù.

1.2.2 ÀÎÅÍ³Ý ÁÖ¼Ò °ü·Ã ±¸Á¶Ã¼

IPv6 ´Â 128ºñÆ® ÁÖ¼Òü°è¸¦ °¡Áö¸ç, À̸¦ Áö¿øÇϱâ À§Çؼ­ ±âÁ¸ÀÇ IPv4 ÀÇ ÁÖ¼Ò ±¸Á¶Ã¼¿Í´Â ´Ù¸¥ Á¤º¸·Î ±¸¼ºµË´Ï´Ù. ÀÌ ÁÖ¼Ò ±¸Á¶Ã¼´Â º¸Åë "sockaddr_in6" ¸¦ »ç¿ëÇϸç, °¢Á¾ ¼ÒÄÏÇÔ¼ö¿¡¼­ »ç¿ëÇÕ´Ï´Ù.

IPv4°¡ °¡Áö´Â sockaddr_in ±¸Á¶Ã¼ÀÇ °æ¿ì 8byte ÀÇ ¿©À¯ ÀúÀå°ø°£À» °¡Áö°í ÀÖ±â´Â ÇÏÁö¸¸ 128 bit Å©±âÀÇ IPv6 ŸÀÔÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇϱ⿡´Â ³Ê¹« ÀÛÀº °ø°£À̱⠶§¹®ÀÌÁÒ. ÃÖ¼ÒÇÑ 16byte ÀÇ Å©±â¸¦ ÁöÁ¤ÇÒ¼ö ÀÖ¾î¾ß Çϴµ¥, ±×·±ÀÌÀ¯·Î ±âÁ¸ÀÇ sockaddr_in ±¸Á¶Ã¼¸¦ È®ÀåÇØ¼­ »ç¿ëÇÏÁö ¸øÇϰí, ÀüÇô »õ·Î¿î ¼ÒÄϱ¸Á¶Ã¼¸¦ ¸¸µé¾ú½À´Ï´Ù. ÀÌ·¸°Ô ÀÛÀº Å©±â·Î ¸¸µç ÀÌÀ¯´Â IPv4 ÇÁ·ÎÅäÄÝÀ» ¸¸µé¶§ 32 bit ¸é ÃæºÐÇÒ°ÍÀ¸·Î »ý°¢Ç߱⠶§¹®Àϰ̴ϴÙ.

1.2.3 ÀÎÅÍ³Ý ÁÖ¼Ò ¿Í ÀÎÅÍ³Ý À̸§°£ º¯È¯ ÇÔ¼öµé

ÀÎÅͳÝÁÖ¼Ò/À̸§ °£ º¯È¯À» À§Çؼ­ º¸Åë gethostbyname°ú gethostbyaddr ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ ÇÔ¼öµéÀº IPv4¿Í IPv6 ¸ðµÎ¸¦ Áö¿øÇÏÁö¸¸, Áö¿øÇÏÁö ¾Ê´Â ¿î¿µÃ¼Á¦ - ¾ö¹ÐÈ÷ ¸»ÇÏÀÚ¸é ¿î¿µÃ¼Á¦¶ó±â º¸´Ù´Â ¿î¿µÃ¼Á¦°¡ Áö¿øÇÏ´Â BSD ¼ÒÄÏ API¿¡ ÀÇÁ¸ÀûÀÓ -°¡ ÀÖÀ»¼öµµ ÀÖÀ½À¸·Î ¹Ýµå½Ã man page µîÀ» ÅëÇØ¼­ È®ÀÎÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. ¸®´ª½º¶ó¸é °í¹ÎÇÒ Çʿ䰡 ¾øÀ» °Ì´Ï´Ù.

1.2.4 ÀÎÅÍ³Ý ÁÖ¼Ò º¯°æÇÔ¼öµé

inet_ntoa()¿Í inet_addr() °°Àº ÇÔ¼öµéÀε¥, IPv4 ÁÖ¼Ò¸¦ (ÀÌÁø µ¥ÀÌÅÍ¿Í printable½ºÅ¸ÀÏ·Î)º¯È¯ ÇϱâÀ§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼öµéÀº 32bit IPv4 ÁÖ¼Ò¿¡ »ç¿ë°¡´ÉÇϵµ·Ï ¸¸µé¾î Á³À¸¸ç, IPv6 ÁÖ¼Ò º¯È¯¿¡´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ±×·¡¼­ »õ·Î¿î API¸¦ »ç¿ëÇØ¾ß ÇÏÁÒ.

1.2.5 ±×¹ÛÀÇ °Íµé

ÀÌ ¿Ü¿¡µµ IPv6 ÀÇ Ãß°¡µÈ ¸î°¡Áö ±â´ÉµéÀ» Á¦°øÇϱâ À§Çؼ­ ¼ÒÄϿɼǰü·Ã ÇÔ¼öµéÀ» ºñ·ÔÇØ¼­ ¸î°¡Áö Ãß°¡µÈ °ÍµéÀÌ ÀÖ½À´Ï´Ù.

1.3 IPv6 °ü·Ã ±¸Á¶Ã¼

IPv4 °ü·Ã ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡¼­ IPv4 ÁÖ¼Ò Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ ¸î °³ÀÇ ±¸Á¶Ã¼¸¦ ´Ù·ç¾ú´Âµ¥¿ä, À̶§ IPv4 °ü·Ã ±¸Á¶Ã¼´Â ¼ÒÄÏ¿¬°á Á¤º¸¸¦ À§Çؼ­ »ç¿ëµÇ´Â sockaddr_in ±¸Á¶Ã¼¿Í ¼ÒÄÏÁÖ¼Ò Á¤º¸¸¦ À§Çؼ­ »ç¿ëµÇ´Â in_addr±¸Á¶Ã¼ ÀÔ´Ï´Ù.

#include <netinet/in.h> 
 
struct sockaddr_in 
{ 
    in_port_t sin_port;         // Port ¹øÈ£ 
    struct in_addr sin_addr;    // ÀÎÅÍ³Ý ÁÖ¼Ò ±¸Á¶Ã¼ 
} 
 
struct in_addr 
{ 
    in_addr_t s_addr;            // 32bit Å©±âÀÇ ÀÎÅͳÝÁÖ¼Ò   
} 
 
in_addr ±¸Á¶Ã¼ÀÇ in_addr_t Àº 32 bit Å©±â¸¦ °¡Áö´Â unsigned long int ÇüÀÌ´Ù.

¹Ý¸é IPv6 ´Â sockaddr_in6 ¶ó´Â º°µµÀÇ ±¸Á¶Ã¼¸¦ »ç¿ëÇÏÁÒ.
#include <netinet/in.h> 
 
struct sockaddr_in6 
{ 
    u_int16m_t      sin6_family;    // AF_INET6  
    u_int16m_t      sin6_port;      // Port ¹øÈ£   
    u_int32m_t      sin6_flowinfo;  // IPv6 flow information 
    struct in6_addr sin6_addr;      // IPv6 ÁÖ¼Ò  
    u_long sin6_scope_id;           // ÀÎÅÍÆäÀ̽º À妽º ¾ÆÀ̵ð 
} 
 
¸â¹ö º¯¼öµé Áß sin6_scope_id¸¦ Á» ´«¿©°Ü º¼ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ °ªÀº ÀÎÅÍÆäÀ̽º¸¦ °¡¸®Å°´Â À妽º °ªÀÔ´Ï´Ù. Áö±ÝÀº IPv4¿Í IPv6ÀÇ °úµµ±âÀä. ±×·¯´Ù º¸´Ï ÇϳªÀÇ ÄÄÇ»ÅͰ¡ ´Ù¾çÇÑ ÀÎÅÍ³Ý ÁÖ¼Ò È¯°æÀ» °¡Áú ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ °³ÀÇ ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽º¸¦ °¡Áú ¼ö Àִµ¥, ¾î¶² ÀÎÅÍÆäÀ̽º´Â IPv4¸¸ ȤÀº IPv6¸¸ ȤÀº ¾çÂÊ ÁÖ¼Ò¸¦ ¸ðµÎ °¡Áú ¼ö ÀÖ½À´Ï´Ù. ÇØ¼­ ¼ÒÄÏÀ» ¹ÙÀεå ÇÒ¶§ ¾î¶² ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇØ¾ßÇÒÁö¸¦ ¸í½ÃÇØ¾ß ÇÕ´Ï´Ù.

1.4 IPv6 Áö¿øÀ» À§ÇÑ ¼ÒÄÏ API

1.4.1 ¼ÒÄÏ »ý¼º/¿¬°á°ü·Ã API

API ¿¡¼­ Á¦°øÇÏ´Â ±âº»ÀûÀÎ ¼ÒÄÏÇÔ¼öµéÀÎ socket, bind, connect, sendmsg, acceptµîÀº IPv6 ¿¡¼­ ±×´ë·Î »ç¿ë°¡´ÉÇÕ´Ï´Ù. ´Ù¸¸ ÇÁ·ÎÅäÄÝÁö¿ø»çÇ×°ú, »ç¿ëµÇ´Â ±¸Á¶Ã¼¿¡ À־ ¾à°£ÀÇ Â÷À̰¡ ÀÖÀ» »ÓÀÌÁÒ.

1.4.2 socket

endpoint ¼ÒÄÏ Áö½ÃÀÚ¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëÇÏ´Â socket() ÇÔ¼öÀÇ °æ¿ì IPv4/TCP ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ°æ¿ì ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÕ´Ï´Ù.
s = socket(PF_INET, SOCK_STREAM, 0); 
 

IPv4/UDP ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ°æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏÁÒ.
s = socket(PF_INET, SOCK_DGRAM, 0); 
 

IPv6 ¸¦ Áö¿øÇÏ´Â ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ¶§´Â PF_INET ´ë½Å¿¡ PF_INET6¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.
s = socket(PF_INET6, SOCK_STREAM, 0); 
s = socket(PF_INET6, SOCK_DGRAM, 0); 
 
ÀÌ·¸°Ô ÇØ¼­ °£´ÜÇÏ°Ô IPv6 ¸¦ Áö¿øÇÏ´Â endpoint ¼ÒÄÏÀ» »ý¼ºÇÒ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡´Â °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥ÀÔ´Ï´Ù.

¿¹Á¦ : ipv6_socket.c
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
int main() 
{ 
    struct sockaddr_in6 sin6; 
    int fd; 
    fd = socket(PF_INET6, SOCK_STREAM, 0); 
    if (fd < 0) 
    { 
        perror("socket create error !!"); 
        exit(0); 
    } 
    printf("Socket Create Success\n"); 
 
    exit(0); 
} 
 

¸¸¾à À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÈÄ ½ÇÇà½ÃÄ״µ¥ ¾Æ·¡¿Í °°Àº ¿¡·¯¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù¸é ipv6 ¸ðµâÀ» ¿Ã¸®Áö ¾Ê¾Ò±â ¶§¹®ÀÔ´Ï´Ù.
[root@localhost c_source]# ./ipv6_socket 
socket create error !! : Address family not supported by protocol 
 

ÀÌ °æ¿ì¿¡´Â ipv6¸ðµâÀ» ¿Ã¸®¸é µË´Ï´Ù.
[root@localhost c_source]# modprobe ipv6 
 

1.4.3 bind

bind´Â socket() ¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºµÈ endpoint ¿¡ Æ÷Æ®¹øÈ£, ÁÖ¼Ò¿Í °°Àº ¼ÒÄÏÆ¯¼ºÀ» ¹­¾îÁÖ±â À§Çؼ­ »ç¿ëÇÕ´Ï´Ù. ¶ÇÇÑ »ç¿ëÇÏ´Â ±¸Á¶Ã¼¿¡ À־µµ IPv4 ¿Í Â÷À̰¡ Àִµ¥, IPv4¿ë ±¸Á¶Ã¼ÀÎ sockaddr_in ´ë½Å¿¡ IPv6 ¿¡¼­ »ç¿ë°¡´ÉÇÑ sockaddr_in6 ±¸Á¶Ã¼¸¦ »ç¿ëÇÏÁÒ.

struct sockaddr_in6 sin6; 
....  
sin6.sin6_family   = AF_INET6; 
sin6.sin6_flowinfo = 0; 
sin6_sin6_port     = htons(23); 
sin6.sin6_addr     = in6addr_any; 
sin6.sin6_addr     = in6addr_any; 
sin6.sin6_scope_id = if_nametoindex("eth0");  
.... 
if (bind(s, (struct sockaddr *)&sin6, sizeof(sin6)) == -1) 
{ 
    // ¿¡·¯Ã³¸® 
} 
.... 
 
¾ð±ÞÇßµíÀÌ, IPv6´Â ¼ÒÄÏÀÌ »ç¿ëÇÒ ÀÎÅÍÆäÀ̽º¸¦ ÁöÁ¤ÇØÁà¾ß Çϴµ¥¿ä,ÀÎÅÍÆäÀ̽º À妽º´Â if_nametoindex ÇÔ¼ö·Î °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù.

ºñ±³Àû °£´ÜÇÏ°Ô ÀÎÅÍÆäÀ̽º À妽º¸¦ °¡Á®¿Ã ¼ö ÀÖÁö¸¸, ÀÌ ¹æ½ÄÀº ¹ü¿ëÀû ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÛ¼ºÇϴµ¥ ¹®Á¦Á¡À» °¡Áú ¼ö ÀÖÁÒ. ÄÄÇ»Å͸¶´Ù ÀÎÅÍÆäÀ̽º À̸§ÀÌ ´Ù¸¦ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ¹°·Ð ping6 ó·³ ÇÁ·Î±×·¥ ½ÇÇà ÀÎÀÚ¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍÆäÀ̽º À̸§À» ¸í½ÃÇÏ´Â ¹æ¹ýÀÌ ÀÖ±ä ÇÏÁö¸¸, ÀÏ¹Ý »ç¿ëÀÚ°¡ »ç¿ëÇÏ´Â ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡¼­ ÀÎÅÍÆäÀ̽º À̸§À» ³Ñ±âµµ·Ï ÇÑ´Ù´Â °Ç °áÄÚ ÁÁÀº ¹æ¹ýÀÌ ¾Æ´Õ´Ï´Ù. ¿Ø¸¸ÇÑ ÇϵåÄÚ¾î »ç¿ëÀÚ°¡ ¾Æ´Ï¶ó¸é, ´©°¡ ÀÎÅÍÆäÀ̽º À̸§±îÁö ½Å°æ¾²¸é¼­ ³×Æ®¿öÅ© ÇÁ·Î±×·¥À» »ç¿ëÇÏ·Á ÇϰڽÀ´Ï±î.

¶§¹®¿¡, ÀÎÅÍÆäÀ̽º ¸ñ·ÏÀ» °¡Á®¿Í¼­, ÀÎÅÍÆäÀ̽ºÀÇ ÁÖ¼Ò Á¤º¸¸¦ È®ÀÎÇØ¼­ ±×¿¡ ¸ÂÃß¾î ÀÚµ¿À¸·Î ¹ÙÀεù ÇØÁÖ´Â ½ÄÀÇ ÇÁ·Î±×·¡¹Ö ±â¹ýÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ¿¡ ´ëÇÑ ³»¿ëÀº ¹®¼­ ¸»¹Ì¿¡¼­ ÀÚ¼¼È÷ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.

1.4.4 ÀÎÅÍÆäÀ̽º ÁÖ¼Ò Á¤º¸ °¡Á®¿À±â

BSD ¼ÒÄÏÀº 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 : µµ¸ÞÀÎ À̸§, ÀÎÅÍ³Ý ÁÖ¼Ò (IPv4, IPv6 ½ºÅ¸ÀÏ ¸ðµÎ Áö¿ø)ÇÑ´Ù.
  • server : ¼­ºñ½º Æ÷Æ®¹øÈ£ ȤÀº ¼­ºñ½º À̸§À» ÁöÁ¤ÇÑ´Ù.
  • hints : getaddrinfo ÇÔ¼ö´Â addrinfo ±¸Á¶Ã¼ÀÇ Á¤º¸¸¦ È®ÀÎÇØ¼­, Á¤º¸¿¡ ¸Â´Â ³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸¸¦ °¡Á®¿Â´Ù.
  • res : ³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸ °á°ú´Â res·Î ³Ñ¾î¿Â´Ù. ¿©·¯ °³ÀÇ ÁÖ¼Ò Á¤º¸°¡ ÀÖÀ» ¼ö ÀÖÀ½À¸·Î ¹è¿­·Î ³Ñ¾î¿Â´Ù.

¾Æ·¡ ¿¹Á¦´Â ¼­¹ö¿¡¼­ getaddrinfo ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù. ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ·Î ÁÖ¾îÁö´Â Æ÷Æ®¹øÈ£¿¡ ´ëÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ³×Æ®¿öÅ© ÁÖ¼Ò Á¤º¸¸¦ È®ÀÎÇØ¼­ bind Çϰí, ¸¸¾à IPv6¿Í IPv4¸¦ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é µÎ °³ÀÇ µè±â ¼ÒÄÏÀ» ¸¸µì´Ï´Ù.
#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;    // IPv4, IPv6¸¦ »ó°üÇÏÁö ¾Ê´Â´Ù.  
    hints.ai_socktype = SOCK_STREAM;    // TCP ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÑ´Ù. 
  
    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);  
 
    // addrinfo¸¦ ¼øÈ¯Çϸ鼭, ¼ÒÄÏÀ» ¹ÙÀεå ÇÑ´Ù. 
    for(rp = result, i=0 ; rp != NULL; rp = rp->ai_next, i++)  
    {  
        // IPv4ÀÏ °æ¿ì 
        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);  
        }  
        // IPv6ÀÏ °æ¿ì 
        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");  
        }  
        // ¸¸¾à IPv6ÀÏ °æ¿ì¿¡´Â getsockopt¸¦ ÀÌ¿ëÇØ¼­ IPv6 ÁÖ¼Ò¸¸ ¹ÙÀÎµå ½Ã۵µ·Ï ÇÑ´Ù.  
        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;  
}  
 
AF_INET6 ¸¸µé¾îÁø ¼ÒÄÏÀº IPv4¿Í IPv6¸ðµÎ¸¦ Áö¿øÇÕ´Ï´Ù. ±×·¡¼­ ¸¸¾à IPv4 ¼ÒÄÏÀ» ¸¸µç´ÙÀ½ IPv6 ¼ÒÄÏÀ» ¸¸µé¸é IPv6 ¼ÒÄÏ¿¡¼­ IPv4±îÁö ÇÔ²² Áö¿øÇÏ°Ô µÇ¹Ç·Î ÁÖ¼Ò Á¤º¸°¡ Áߺ¹µÇ¾î¼­ bind ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ setsockopt ÇÔ¼ö·Î ¼ÒÄÏÀÌ IPv6¸¸ Áö¿øÇϵµ·Ï ¼³Á¤Çß½À´Ï´Ù.

1.4.5 listen

listen ÇÔ¼öÀÇ °æ¿ì ipv4 ¿Í »ç¿ë»ó¿¡ À־ ÀüÇôÂ÷À̰¡ ¾ø½À´Ï´Ù.
if (listen(sockfd, 5) == -1) 
{ 
    // ¿¡·¯Ã³¸® 
}  
 

1.4.6 accept()

accept ¿ª½Ã 2¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ ¼ÒÄϱ¸Á¶Ã¼ °¡ sockaddr_in À¸·Î ¹Ù²ï´Ù´Â Á¡¸¸ Á¦¿ÜÇϰí´Â µ¿ÀÏÇÕ´Ï´Ù.
struct sockaddr_in6 clisin6 
clisockfd = accept(sockfd, (struct sockaddr *)&clisin6,   
            (socklen_t *)&clilen); 
 

1.5 ÁÖ¼Òº¯È¯°ü·Ã API

ipv4 ¿¡¼­´Â ¹®ÀÚ¿­ÀÇ ÀÎÅͳÝÁÖ¼Ò¸¦ 32bit ÀÌÁø µ¥ÀÌŸ ÁÖ¼Ò·Î º¯È¯Çϱâ À§Çؼ­ inet_addr À», ±×¹Ý´ë·Î 32bit ÀÌÁø µ¥ÀÌŸ ÁÖ¼Ò¸¦ ¹®ÀÚ¿­ÀÇ ÀÎÅͳÝÁÖ¼Ò·Î º¯È¯Çϱâ À§Çؼ­ inet_ntoa ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù.

À̵é ÇÔ¼ö´Â ±âº»ÀûÀ¸·Î 32bit ÀÎÅÍ³Ý ÁÖ¼Ò¿¡ ÃÖÀûÈ­ µÈ°ªµéÀ̱⠶§¹®¿¡ 128ºñÆ® ÁÖ¼Òü°è¸¦ °¡Áö´Â IPv6 ÁÖ¼ÒÀÇ º¯È¯À» À§Çؼ­´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.

¶§¹®¿¡ º°µµÀÇ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¹®ÀÚ¿­ÀÇ IPv6 ÀÎÅͳÝÁÖ¼Ò¸¦ 128bit ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò·Î º¯°æÇϱâ À§Çؼ­ inet_pton ±× ¹Ý´ëÀÇ º¯°æÀ» À§Çؼ­ inet_ntop ¸¦ Á¦°øÇÕ´Ï´Ù.

1.5.1 inet_pton

IPv6 ¹®ÀÚ¿­ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ 128 ºñÆ® ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò·Î º¯°æÇϱâ À§Çؼ­ »ç¿ëµÇ´Â ÇÔ¼öÀÔ´Ï´Ù. ÀÌÇÔ¼ö´Â IPv6 ¿¡¸¸ ƯȭµÈ ÇÔ¼ö´Â ¾Æ´Ï¸ç, ÇÁ·ÎÅäÄÝ ¹ü¿ëÀ¸·Î »ç¿ëÇÒ¼ö ÀÖµµ·Ï inet_addr ÇÔ¼ö¸¦ È®Àå½ÃŲ°ÍÀ¸·Î IPv4 ¿Í IPv6 ¸ðµÎÀÇ ÁÖ¼Òº¯È¯¿¡ »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
 
int inet_aton(int af, const char *src, void *dst); 
 

ù¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ af¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÅäÄÝ Á¾·ù¸¦ ÁöÁ¤ÇÒ¼ö ÀÖÀ¸¸ç, µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ src°¡ °¡¸£Å°´Â ÀÎÅÍ³Ý ¹®ÀÚ¿­À» ÇÁ·ÎÅäÄÝÁ¾·ù¿¡ ¸Âµµ·Ï ÀÌÁøµ¥ÀÌŸ·Î º¯°æÇؼ­ dst·Î º¹»çÇÕ´Ï´Ù. ¸¸¾à À߸øµÈ ÁÖ¼ÒÀ̸§À» º¯°æÇϰíÀÚ ÇÒ°æ¿ì¿¡´Â 0À» ¹ÝȯÇÕ´Ï´Ù.

1.5.2 inet_ntop

inet_pton °ú ¹Ý´ëÀÇ ÀÏÀ» ÇÕ´Ï´Ù. Áï 128ºñÆ® ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò¸¦ ¹®ÀÚ¿­ ÀÎÅÍ³Ý ÁÖ¼Ò·Î º¯°æÇÕ´Ï´Ù. ÀÌÇÔ¼ö ¿ª½Ã IPv6 Àü¿ëÀÇ ÇÔ¼ö´Â ¾Æ´Ï¸ç ÇÁ·ÎÅäÄÝ ¹ü¿ëÀ¸·Î »ç¿ëÇÒ¼ö ÀÖµµ·Ï inet_ntoa ¸¦ È®ÀåÇÑ ÇÔ¼öÀÔ´Ï´Ù.

const char *inet_ntop(int af, const void *src, char *dst, size_t cnt); 
 

1.5.3 ÁÖ¼Òº¯°æ ¿¹Á¦

´ÙÀ½Àº inet_pton °ú Inet_ntop ¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ ÁÖ¼Òº¯°æ ÇÁ·Î±×·¥ÀÔ´Ï´Ù.

¿¹Á¦ : addr_cp.c
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <unistd.h> 
 
int main() 
{ 
    ulong ipv4_addr; 
    char  ipv6_addr[16]; 
 
    char addr4_str[20]; 
    char addr6_str[40]; 
 
    struct in_addr  st_addr4; 
    struct in6_addr st_addr6; 
 
    // IPv4 ÀÎÅÍ³Ý ÁÖ¼Ò º¯È¯ ¿¹Á¦  
    inet_pton(AF_INET, "192.168.0.224", (void *)&ipv4_addr); 
    printf("%lu\n", ipv4_addr); 
 
    st_addr4.s_addr = ipv4_addr; 
    inet_ntop(AF_INET, (void *)&st_addr4,addr4_str,sizeof(addr4_str)); 
    printf("%s\n\n", addr4_str); 
 
    // IPv6 ÀÎÅÍ³Ý ÁÖ¼Ò º¯È¯ ¿¹Á¦ 
    inet_pton(AF_INET6, "3ffe:ffff:0:f101::1", (void *)&ipv6_addr); 
    memcpy((void *)&st_addr6, (void *)&ipv6_addr, sizeof(st_addr6)); 
    inet_ntop(AF_INET6, (void *)&st_addr6, addr6_str, sizeof(addr6_str)); 
    printf("%s\n", addr6_str); 
} 
 

1.6 ipv6 ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ¿¹Á¦

ÀÏ´Ü IPv6 ¼ÒÄÏÀ» ¸¸µé°í ¿¬°áÇϱâ À§ÇÑ ±âº»ÀûÀÎ API ¿¡ ´ëÇØ¼­ ¾Ë¾ÆºÃÀ½À¸·Î ±âº»ÀûÀÎ IPv6 ±â¹ÝÀÇ ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ »óÅÂÀÔ´Ï´Ù. ÀÌÁ¦ ½ÇÁ¦ IPv6 ±â¹ÝÀÇ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇØ¼­ Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

¸¸µé·Á´Â ¾îÇø®ÄÉÀ̼ÇÀº echo ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÔ´Ï´Ù.

Å×½ºÆ®¸¦ ÇϱâÀü¿¡ ¸ÕÀú IPv6 ȯ°æÀ» ¸¸µé¾îÁà¾ß Çϴµ¥, ifconfig ¸¦ ÀÌ¿ëÇØ¼­ ¼öµ¿À¸·Î IPv6 ¹øÈ£¸¦ ÇÒ´çÇß½À´Ï´Ù. IP ¹øÈ£´Â 3ffe:ffff:0:f101::1/128 ·Î ¼¼ÆÃÇß½À´Ï´Ù. ifconfig ¸¦ ÅëÇÑ IPv6 ÇÒ´ç¿¡ °üÇÑ ³»¿ëÀº IPv6(2) - ȯ°æ¼³Á¤ ¹®¼­¸¦ Âü°íÇÏ½Ã¸é µË´Ï´Ù.

´ÙÀ½Àº ifconifg ¸¦ ÅëÇØ¼­ È®ÀÎÇÑ °á°úÀÔ´Ï´Ù.
eth0      Link encap:Ethernet  HWaddr 00:50:BF:2C:7B:B2   
          inet addr:211.244.233.145  Bcast:211.244.233.255  Mask:255.255.255.0 
          inet6 addr: 3ffe:ffff:0:f101::1/128 Scope:Global 
          UP BROADCAST NOTRAILERS RUNNING  MTU:1500  Metric:1 
          RX packets:28404 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:12580 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0  
          RX bytes:20470271 (19.5 Mb)  TX bytes:1190821 (1.1 Mb) 
 
lo        Link encap:Local Loopback   
          inet addr:127.0.0.1  Mask:255.0.0.0 
          inet6 addr: ::1/128 Scope:Host 
          UP LOOPBACK RUNNING  MTU:16436  Metric:1 
          RX packets:337 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:337 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0  
          RX bytes:23808 (23.2 Kb)  TX bytes:23808 (23.2 Kb) 
 

1.6.1 echo ¼­¹ö

¿ì¼± ¼­¹öÃø ÇÁ·Î±×·¥À» ¸¸µé¾îºÃ½À´Ï´Ù. ¿¡·¯Ã³¸® °°Àº°Ç ½Å°æ¾²Áö ¾Ê¾Ò½À´Ï´Ù.

¿¹Á¦ echo6_s.c
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
int main(int argc, char **argv) 
{ 
    struct sockaddr_in6 sin6, clisin6; 
    int sockfd, clisockfd; 
    int clilen = sizeof(clisin6); 
    char buf[256]; 
    sockfd = socket(AF_INET6, SOCK_STREAM, 0); 
    if (sockfd < 0) 
    { 
        perror("socket create error:"); 
        exit(0); 
    } 
 
    // bind ¸¦ À§Çؼ­ ¼ÒÄÏÆ¯¼ºÀ» ¹­¾îÁØ´Ù.  
    // IPv6 ¹öÁ¯À¸·Î ¸ÂÃá´Ù. 
    sin6.sin6_family   = AF_INET6; 
    sin6.sin6_flowinfo = 0; 
    sin6.sin6_port     = htons(atoi(argv[1])); 
    // in6addr_any ´Â *: ¸¦ ³ªÅ¸³½´Ù. 
    // ipv4 ¿¡¼­ÀÇ htonl(INADDR_ANY) ¿Í µ¿ÀÏÇÏ´Ù°í º¼¼ö ÀÖ´Ù.  
    sin6.sin6_addr     = in6addr_any; 
 
    if (bind(sockfd, (struct sockaddr *)&sin6, sizeof(sin6)) == -1) 
    { 
        perror("Bind error:"); 
        exit(0); 
    } 
 
    if (listen(sockfd, 5) == -1) 
    { 
        perror("Listen error:"); 
        exit(0); 
    } 
 
    while(1) 
    { 
        clisockfd = accept(sockfd, (struct sockaddr *)&clisin6, 
                       (socklen_t *)&clilen); 
        memset(buf, 0x00, 256); 
        read(clisockfd, buf, 256); 
        write(clisockfd, buf, 256); 
 
        close(clisockfd); 
    } 
} 
 
±¸Á¶Ã¼°¡ IPv6 °ü·Ã±¸Á¶Ã¼°¡ ¾²¿´´Ù´Â°Í°ú, socket ¿¡¼­ ÇÁ·ÎÅäÄÝÀ» AF_INET6 ¸¦ »ç¿ëÇß´Ù´Â°Í ¿Ü¿¡´Â IPv4 ¹öÁ¯ÀÇ echo ¼­¹ö¿Í º°Â÷À̸¦ ´À³¥¼ö ¾ø±º¿ä.

1.6.2 echo Ŭ¶óÀ̾ðÆ®

À̹ø¿¡´Â Ŭ¶óÀ̾ðÆ®Ãø ÇÁ·Î±×·¥ÀÔ´Ï´Ù.

¿¹Á¦ : echo_c.c
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
int main(int argc, char **argv) 
{ 
    struct sockaddr_in6 svrsin6; 
    struct hostent *hp; 
    char   ipv6_addr[16]; 
 
    char    addr6_str[40]; 
    char    buf[256]; 
 
    int sockfd; 
    int clilen; 
 
    sockfd = socket(AF_INET6, SOCK_STREAM, 0); 
    if (sockfd < 0) 
    { 
        perror("socket create error:"); 
        exit(0); 
    } 
 
    svrsin6.sin6_family   = AF_INET6; 
    svrsin6.sin6_flowinfo = 0; 
    svrsin6.sin6_port     = htons(atoi(argv[1])); 
 
    inet_pton(AF_INET6, "3ffe:ffff:0:f101::1", (void *)&ipv6_addr); 
    // in6addr_loopback ´Â loopback ÁÖ¼Ò·Î ¿¬°áÇϱâ À§Çؼ­  
    // »ç¿ëÇÑ´Ù.   
    // ipv6 ¿¡¼­ÀÇ loopbak ÁÖ¼Ò´Â "::1" ÀÌ´Ù.   
    // ·çÇÁ¹éÁÖ¼Ò·Î ¿¬°áÇÏ±æ ¿øÇÑ´Ù¸é 
    // svrsin6.sin6_addr      = in6addr_loopback;    
    // ȤÀº 
    // inet_pton(AF_INET6, "::1", (void *)&ipv6_addr);  
    // ÇϸéµÈ´Ù.  
    memcpy((void *)&svrsin6.sin6_addr, (void *)&ipv6_addr, 16); 
    inet_ntop(AF_INET6, (void *)&svrsin6.sin6_addr, addr6_str, 40); 
 
    printf("%s\n", addr6_str); 
    printf("connect...\n"); 
    clilen = sizeof(svrsin6); 
    if(connect(sockfd, (struct sockaddr *)&svrsin6, clilen) < 0) 
    { 
        perror("connect error:"); 
        exit(0); 
    } 
    memset(buf, 0x00, 256); 
    read(0, buf, 256); 
    write(sockfd, buf, 256); 
    read(sockfd, buf, 256); 
    printf("-->%s", buf); 
 
    printf("Connect Success\n"); 
    close(sockfd); 
    exit(0); 
} 
 

echo ¼­¹ö¸¦ ¶ç¿î´ÙÀ½¿¡ À§ÀÇ Å¬¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѼ­ °£´ÜÇÏ°Ô Å×½ºÆ®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼­¹ö/Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇϰí netstat¸¦ ÀÌ¿ëÇØ¼­ ¿¬°á »óŸ¦ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
[root@localhost test]# netstate -a 
... 
tcp        0      0 *:1111                  *:*                     LISTEN       
tcp        1      0 ::1:33147               3ffe:ffff:0:f101 1111 CLOSE_WAIT   
... 
 
IPv6 ¸¦ »ç¿ëÇÑ ¿¬°áÀÌ Á¦´ë·Î ÀÌ·ç¾îÁ³À½À» È®ÀÎÇÒ¼ö ÀÖ´Ù.

1.7 IPv6¿Í IPv4 ¸ðµÎ¿¡ ´ëÀÀÇϴ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ °³¹ß

À§ÀÇ ¿¡ÄÚ ¿¹Á¦ ÇÁ·Î±×·¥µéÀº ¿¹Á¦ÀÏ »Ó, ½ÇÁ¦ °³¹ß¿¡ »ç¿ëÇϱ⿡´Â ¹«¸®°¡ ÀÖ½À´Ï´Ù. ½ÇÁ¦ ÄÄÇ»ÅÍ´Â ´Ù¾çÇÑ ³×Æ®¿öÅ© ÁÖ¼Ò È¯°æÀ» °¡Áú ¼ö Àֱ⠶§¹®¿¡, ³×Æ®¿öÅ© ÁÖ¼Ò È¯°æÀ» °Ë»çÇØ¼­ ±×¿¡ ¸Â´Â ¼ÒÄÏÀ» ¸¸µé¾î¾ß Çϱ⠶§¹®ÀÔ´Ï´Ù . ±×·¯¹Ç·Î getaddrinfo ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ³×Æ®¿öÅ© ȯ°æÀ» Á¶»çÇØ¼­ ±×¿¡ ¸Â´Â ÁÖ¼Ò Á¤º¸¸¦ °¡Áö´Â ¼ÒÄÏÀ» »ý¼ºÇϵµ·Ï ÇÁ·Î±×·¥À» ÀÚµ¿È­ÇؾßÇÕ´Ï´Ù.

¼­¹ö ÇÁ·Î±×·¥Àº getaddrinfo ¿¹Á¦¸¦ ÅëÇØ¼­ Ȱ¿ë¹æ¾ÈÀÌ ÀÌ¹Ì Á¦½ÃµÇ¾úÀ¸´Ï ³Ñ¾î°¡µµ·Ï ÇϰڽÀ´Ï´Ù. listen ÇÔ¼ö±îÁö È£ÃâÇßÀ¸´Ï, accept ÇÔ¼öÈ£Ãâ°ú ±× ÀÌÈÄ ÀÌ·ç¾îÁö´Â Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ Åë½ÅÀº ÀϹÝÀûÀÎ ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ±â¼úÀ» ÀÌ¿ëÇØ¼­ ¸¸µé¸é µË´Ï´Ù.

´Ü ÀÌ ¿¹Á¦´Â ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽º°¡ IPv6¿Í IPv4 ¸ðµÎ¸¦ Áö¿øÇÒ ¶§, µÎ°³ÀÇ ¼ÒÄÏÀ» ¸¸µç´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù. ÀÔÃâ·Â ´ÙÁßÈ­, ¸ÖƼ ½º·¹µå/ÇÁ·Î¼¼½º µîÀÇ ¹æ¹ýÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖ´Â ¹®Á¦À̱ä ÇÏÁö¸¸ ¹ø°Å·ÓÁÒ. IPv6ÀÏ ¶§´Â IPv4 ÁÖ¼Ò±îÁö ÇÔ²² »ç¿ëÇϵµ·Ï ÇØ¼­ ÇϳªÀÇ ¼ÒÄÏÀ¸·Î IPv4, IPv6¸¦ Áö¿øÇϵµ·Ï ÇÏ´Â°Ô ³´½À´Ï´Ù. ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ·Î »ç¿ëÇÒ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ ¸í½ÃÇÏ´Â°Ô ¼ÓÆíÇϰÚÁÒ.

Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ¼­¹ö¿¡ ºñÇØ¼­ ½Å°æ½á¾ß µÉ°Ô Çϳª ´õ ÀÖ½À´Ï´Ù. ¼­¹ö ÇÁ·Î±×·¥ÀÌ¾ß Àü¹®ÀûÀÎ °³¹ßÀÚ³ª °ü¸®ÀÚ°¡ ½ÇÇàÀ» ½Ãų °ÍÀ̱⠶§¹®¿¡, ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ·Î »ç¿ëÇÒ IP ÇÁ·ÎÅäÄÝÀÇ ¹öÀüÀ» ¸í½ÃÇϵµ·Ï ÇÏ´Â°Ô Å« ¹®Á¦°¡ µÇÁø ¾Ê°ÚÁö¸¸, ±×·¯³ª ÀϹÝÀ¯Àú°¡ »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ®±îÁö ±×·¸°Ô ÇÒ ¼ö´Â ¾ø°ÚÁÒ. °¡Àå ÁÁÀº ¹æ¹ýÀº ¿¬°áÇϰíÀÚ ÇÏ´Â ¼­¹öÃø ³×Æ®¿öÅ© ȯ°æ¿¡ ¸Â´Â ÁÖ¼Ò ÀÚ¿øÀ» °¡Áø ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅÃÇÏ´Â °Ì´Ï´Ù.

¾ð¶æ »ý°¢ÇØ º¸ÀÚ¸é, getaddrinfo ÇÔ¼ö°¡ ÀÖÀ¸´Ï Å©°Ô ¹®Á¦ µÉ°Í °°Áö´Â ¾ÊÁö¸¸, ÇѰ¡Áö »ç¼ÒÇÑ ¹®Á¦°¡ ÀÖÀ¸´Ï ¤°í ³Ñ¾î°¡ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ´ÙÀ½Àº IPv4¿Í IPv6¸ðµÎ¿¡ ´ëÀÀÇÒ ¼ö ÀÖ´Â ÄÚµå ¿¹Á¦ÀÔ´Ï´Ù.
#include <sys/stat.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <netdb.h> 
#include <net/if.h> 
 
#define MAXBUF    1024 
 
int main(int argc, char **argv) 
{ 
    struct sockaddr_in addr; 
    struct sockaddr_in6 *addr6; 
    struct addrinfo hints; 
    struct addrinfo *result, *rp; 
    struct if_nameindex *ifidx; 
 
    int sockfd=-1; 
 
    if(argc != 3) 
    { 
        printf("Usage : %s [ip] [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(argv[1], argv[2], &hints, &result) != 0 ) 
    { 
        perror("getaddrinfo"); 
        return 1; 
    }    
 
    for(rp = result ; rp != NULL; rp=rp->ai_next) 
    {    
        if(rp->ai_family == AF_INET) 
        {        
            if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) 
            {            
                perror("socket error"); 
                return 1; 
            } 
            printf("IPv4\n"); 
            connect(sockfd, rp->ai_addr, rp->ai_addrlen); 
            break; 
        } 
        else if(rp->ai_family == AF_INET6) 
        { 
            if( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 ) 
            { 
                perror("socket error"); 
                return 1; 
            } 
            ifidx = if_nameindex(); 
            // ¹Ù·Î À̺κР
            while(ifidx->if_name != NULL) 
            { 
                addr6 = (struct sockaddr_in6 *)rp->ai_addr; 
                addr6->sin6_scope_id = ifidx->if_index; 
                if((sockfd = connect(sockfd, (struct sockaddr *)addr6, rp->ai_addrlen)) >= 0) 
                { 
                    printf("socket created\n"); 
                    break; 
                } 
            } 
        } 
    } 
 
    if(sockfd >=0) 
    { 
        printf("Connect Success\n"); 
    } 
} 
 
À§ÀÇ Äڵ忡¼­ "¹Ù·Î À̺κÐ"À̶ó°í ÁÖ¼® ó¸®µÈ °÷À» º¸ÁÒ.

AF_INET6¿¡¼­´Â ÀÎÅÍÆäÀ̽º À妽º¸¦ ÁöÁ¤ÇØÁà¾ß ÇÕ´Ï´Ù. ±×·¯³ª ¹ö±×ÀÎÁö´Â ¸ô¶óµµ get_addrinfo´Â sin6_scope_id¸¦ ¼³Á¤ÇØ ÁÖÁö ¾Ê´Â´Ù. °á±¹Àº °³¹ßÀÚ°¡ Á÷Á¢ ÀÎÅÍÆäÀ̽º À妽º¸¦ °Ë»çÇØ¼­ sin6_scope_id¸¦ ÁöÁ¤ÇØÁà¾ß ÇÕ´Ï´Ù.

BSD ¼ÒÄÏÀº if_nameindex¶ó´Â ÇÔ¼ö¸¦ Á¦°øÇϴµ¥, ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍÆäÀ̽º Á¤º¸ ¸ñ·ÏÀ» °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù. ·çÇÁ¸¦ µ¹¸é¼­ ÀÎÅÍÆäÀ̽º À妽º¸¦ °¡Á®¿À°í, À̸¦ sin6_scope_id¿¡ ÁöÁ¤Çؼ­ connect¸¦ ½ÃµµÇÏ´Â ½ÄÀ¸·Î ÀÌ ¹®Á¦¸¦ ÇØ°á Çß½À´Ï´Ù.

2 °á·Ð

ÀÌ»ó °£´ÜÇÏ°Ô IPv6 ±â¹ÝÀÇ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ±â¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. À̹®¼­¿¡¼­´Â ¸ðµç °ÍÀ» ¼³¸íÇϰí ÀÖÁö´Â ¾ÊÀ¸¸ç, IPv6 ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ °¡Àå ±âº»ÀÌ µÇ´Â ³»¿ëµé¸¸ ´Ù·ç°í ÀÖ½À´Ï´Ù. ÈÄ¿¡ ¶óµµ ¸î°¡Áö ºüÁø API µé°ú, IPv6 ¿¡¼­ È®ÀåµÈ ´Ù¸¥ ±â´ÉÀ» ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇÑ ³»¿ëÀ» Ãß°¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

category_network
programing
category__5
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.