ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
1 IPv6 ÇÁ·Î±×·¡¹Ö
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 Áö¿øÀ» À§ÇÑ ¼ÒÄÏ API1.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); s = socket(PF_INET, SOCK_DGRAM, 0); 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); } [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);
#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); 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); } [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 ¿¡¼ È®ÀåµÈ ´Ù¸¥ ±â´ÉÀ» ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇÑ ³»¿ëÀ» Ãß°¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|