IPv6 Programing
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>IPv6_Programing



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

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!--           --> 
<articleinfo> 
    <title>IPv6 Programing</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>dreamyun@yahoo.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
    <revhistory> 
        <revision> 
            <revnumber>0.8</revnumber> 
            <date>2003³â 3¿ù 19ÀÏ 23½Ã</date> 
            <revremark>ÃÖÃÊ ¹®¼­ÀÛ¼º</revremark> 
        </revision> 
    </revhistory> 
</articleinfo> 
 
 
<section> 
    <title>¼Ò°³</title> 
    <para> 
        2¹ø Á¤µµÀÇ IPv6 °ü·Ã ±â»ç¸¦ ÅëÇØ¼­, IPv6 ÀÇ ±âº»ÀûÀΠƯ¼º°ú  
        ¸®´ª½º »ó¿¡¼­ IPv6 ȯ°æÀ» ¸¸µé±â À§ÇÑ ¹æ¹ý¿¡ ´ëÇØ¼­  
        ¾Ë¾Æº¸¾Ò´Ù.   
    </para> 
    <para> 
        À̹ø °­Á´ ¿©·¯ºÐÀÌ IPv6 ¿¡ ´ëÇÑ ±âÃÊÀûÀÎ Áö½ÄÀ» °¡Áö°í ÀÖÀ¸¸ç,  
        ¸®´ª½º »ó¿¡ IPv6 ȯ°æÀ» ¸¸µé¼ö ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡,  
        ½ÇÁúÀûÀÎ IPv6 ÇÁ·Î±×·¡¹Ö °úÁ¤¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÒ°ÍÀÌ´Ù.   
    </para> 
    <para> 
        IPv6ÀÇ °³³ä°ú ¸®´ª½º»ó¿¡¼­ÀÇ IPv6 ȯ°æ±¸Ãà¿¡ ´ëÇÑ ³»¿ëÀ»  
        ¾ÆÁ÷ ¸ð¸£°í ÀÖ´Ù¸é <ulink url=/modules.php?name=News&file=article&sid=96>IPv6(1) - °³¿ä</ulink> ¿Í  
        <ulink url=modules.php?name=News&file=article&sid=103>IPv6(2) - ȯ°æ¼³Á¤</ulink> ¹®¼­¸¦ ¸ÕÀú ÀÐ¾î º¸±â ¹Ù¶õ´Ù.   
    </para> 
    <para> 
        ¶ÇÇÑ ÀÌ °­Á´ ¿©·¯ºÐÀÌ Socket API¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ Çϰí ÀÖ´Ù´Â  
        °¡Á¤ÇÏ¿¡ ÀÌ·ç¾îÁú°ÍÀÌ´Ù.  
    </para> 
</section> 
<section> 
    <title>IPv6 Socket ÇÁ·Î±×·¡¹Ö</title> 
    <para> 
        ¿©±â¿¡¼­´Â IPv6 ¸¦ À§ÇÑ ¼ÒÄÏÁö¿ø»çÇ×°ú °ü·Ã ±¸Á¶Ã¼ Á¤º¸¿Í  
        IPv6 ¸¦ ´Ù·ç±â À§ÇÑ ±âº»ÀûÀÎ API ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¼°ÍÀÌ´Ù.   
    </para> 
    <para> 
        ¿©±â¿¡ Àִ±ÛÀº Linux Kernel 2.4.x »ó¿¡¼­ Å×½ºÆ® µÇ¾ú´Ù.  
    </para> 
    <section> 
        <title>º¯°æ»çÇ×µé</title>  
        <section> 
            <title>È®ÀåµÈ APIµé</title> 
            <para> 
                ³ªÁß¿¡ ¿¹Á¦¸¦ º¸¸é ¾Ë°ÚÁö¸¸ IPv4, IPv6 ¸ðµÎ  
                ±âº»ÀûÀÎ ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀº ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù.  
                ´Ù¸¸ IPv6 ÀÇ °æ¿ì IP ÁÖ¼Òü°èÀÇ º¯È¯°ú ±×¿¡ µû¸¥  
                ¸î°¡Áö ´Ù¸¥ API µéÀÌ Á¦°øµÇ´Â Á¤µµ¿¡ Â÷À̰¡ ÀÖÀ» »ÓÀÌ´Ù.   
                <itemizedlist>     
                    <listitem> 
                        <para> 
                            ÀÎÅÍ³Ý ÁÖ¼Ò °ü·Ã ±¸Á¶Ã¼     
                        </para> 
                        <para> 
                            IPv6 ´Â 128ºñÆ® ÁÖ¼Òü°è¸¦ °¡Áö¸ç,  
                            À̸¦ Áö¿øÇϱâ À§Çؼ­ ±âÁ¸ÀÇ IPv4 ÀÇ ÁÖ¼Ò ±¸Á¶Ã¼¿Í´Â  
                            ´Ù¸£°Ô ±¸¼ºµÈ´Ù. ÀÌ ÁÖ¼Ò ±¸Á¶Ã¼´Â º¸Åë  
                            "sockaddr_in" À̶ó´Â À̸§ÀÇ ±¸Á¶Ã¼·Î ÀÛ¼ºµÇ¸ç,  
                            °¢Á¾ ¼ÒÄÏÇÔ¼ö¿¡¼­ »ç¿ëµÇ¾îÁø´Ù. ÀÌ·¯ÇÑ ¼ÒÄÏÇÔ¼öµéÀÇ  
                            °æ¿ì IPv4 ¿Í IPv6 °£ Â÷ÀÌ´Â ¾øÀ¸³ª, ÁÖ¼Ò±¸Á¶Ã¼ÀÇ °æ¿ì  
                            Â÷À̸¦ °¡Áö°Ô µÈ´Ù. IPv6 ÀÇ °æ¿ì sockaddr_in6 ¶ó´Â  
                            »õ·Î¿î ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.   
                        </para> 
                        <para> 
                            »ç½Ç IPv4°¡ °¡Áö´Â sockaddr_in ±¸Á¶Ã¼ÀÇ °æ¿ì  
                            8byte ÀÇ ¿©À¯ ÀúÀå°ø°£À» °¡Áö°í ÀÖ±â´Â ÇÏ´Ù.  
                            ±×·¯³ª 128 bit Å©±âÀÇ IPv6 ŸÀÔÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇϱ⿡´Â  
                            ³Ê¹« ÀÛÀº °ø°£ÀÌ´Ù. ÃÖ¼ÒÇÑ 16byte ÀÇ Å©±â¸¦ ÁöÁ¤ÇÒ¼ö  
                            ÀÖ¾î¾ß Çϴµ¥, ±×·±ÀÌÀ¯·Î ±âÁ¸ÀÇ sockaddr_in ±¸Á¶Ã¼¸¦  
                            È®ÀåÇØ¼­ »ç¿ëÇÏÁö ¸øÇϰí, ÀüÇô »õ·Î¿î ¼ÒÄϱ¸Á¶Ã¼¸¦  
                            ¸¸µé°Ô µÈ°ÍÀÌ´Ù. ¾Æ¸¶µµ óÀ½¿¡ IPv4 ÇÁ·ÎÅäÄÝÀ»  
                            ¸¸µé¶§ 32 bit ¸é ÃæºÐÇÒ°ÍÀ¸·Î »ý°¢Ç߱⠶§¹®ÀϰÍÀÌ´Ù.   
                        </para> 
                    </listitem> 
                    <listitem> 
                        <para> 
                            ÀÎÅÍ³Ý ÁÖ¼Ò ¿Í ÀÎÅÍ³Ý À̸§°£ º¯È¯ ÇÔ¼öµé  
                        </para> 
                        <para> 
                            ÀÎÅͳÝÁÖ¼Ò/À̸§ °£ º¯È¯À» À§Çؼ­ º¸Åë gethostbyname()°ú  
                            gethostbyaddr() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. º¸Åë ÀÌÇÔ¼öµéÀº  
                            IPv4¿Í IPv6 ¸ðµÎ¸¦ Áö¿øÇÏÁö¸¸, Áö¿øÇÏÁö ¾Ê´Â OS°¡ ÀÖÀ»¼öµµ  
                            ÀÖÀ½À¸·Î ¹Ýµå½Ã man page µîÀ» ÅëÇØ¼­ È®ÀÎÇØ ÁÖ¾î¾ß ÇÑ´Ù.  
                        </para> 
                        <para> 
                            Linux 2.4.x ¿¡¼­ÀÇ °æ¿ì Ipv6 ¿¡µµ »ç¿ë°¡´ÉÇϵµ·Ï È®Àå µÇ¾îÀÖ´Ù.   
                        </para> 
                    </listitem> 
                    <listitem> 
                        <para> 
                            ÀÎÅÍ³Ý ÁÖ¼Ò º¯°æÇÔ¼öµé     
                        </para> 
                        <para> 
                            inet_ntoa()¿Í inet_addr() °°Àº ÇÔ¼öµéÀε¥,  
                            IPv4 ÁÖ¼Ò¸¦ binary ¿Í printable °£  
                            º¯°æÀ» À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼öµéÀº 32bit IPv4 ÁÖ¼Ò¿¡  
                            »ç¿ë°¡´ÉÇϵµ·Ï ¸¸µé¾î Á³À¸¸ç, ´ç¿¬È÷ 128bit IPv6 ¿¡´Â  
                            »ç¿ëÀÌ ºÒ°¡´ÉÇÏ´Ù. ±×·± ÀÌÀ¯·Î »õ·Î¿î API¸¦ Á¦°øÇÑ´Ù.    
                        </para> 
                        <para> 
                            À̵鳻¿ëÀº <xref linkend="addr">¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.    
                        </para> 
                    </listitem> 
                    <listitem> 
                        <para> 
                            ±×¹ÛÀÇ °Íµé 
                        </para> 
                        <para> 
                            ÀÌ ¿Ü¿¡µµ IPv6 ÀÇ Ãß°¡µÈ ¸î°¡Áö ±â´ÉµéÀ» Á¦°øÇϱâ À§Çؼ­  
                            ¼ÒÄϿɼǰü·Ã ÇÔ¼öµéÀ» ºñ·ÔÇØ¼­ ¸î°¡Áö  
                            Ãß°¡µÈ °ÍµéÀÌ ÀÖ´Ù.  
                        </para> 
                    </listitem> 
                </itemizedlist>     
            </para> 
        </section> 
        <section> 
            <title>IPv6 °ü·Ã ±¸Á¶Ã¼</title> 
            <para> 
                ¾Æ¸¶µµ À̱ÛÀ» Àаí ÀÖ´Â ¿©·¯ºÐÀº ºÐ¸í IPv4 ±â¹ÝÇÏ¿¡¼­ÀÇ  
                ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇØ¼­´Â ¸Å¿ì ´É¼÷Çϸ®¶ó.  
                IPv4 °ü·Ã ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡¼­ ¿ì¸®´Â IPv4 Á¤º¸¸¦ È¿°úÀûÀ¸·Î  
                ÀúÀåÇϱâ À§ÇÑ ¿©·¯°¡Áö ±¸Á¶Ã¼¸¦ ´Ù·ç¾ú¾ú´Ù.  
            </para> 
            <para> 
                ¿©·¯ºÐÀÌ ´Ù·ç¾ú´ø IPv4 °ü·Ã ±¸Á¶Ã¼´Â ¼ÒÄÏ¿¬°á Á¤º¸¸¦ À§Çؼ­  
                »ç¿ëµÇ´Â <emphasis>sockaddr_in</emphasis> ±¸Á¶Ã¼¿Í  
                ¼ÒÄÏÁÖ¼Ò Á¤º¸¸¦ À§Çؼ­ »ç¿ëµÇ´Â <emphasis>in_addr</emphasis>±¸Á¶Ã¼  
                ÀÌ´Ù.  
                <screen> 
#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 Å©±âÀÇ ÀÎÅͳÝÁÖ¼Ò   
} 
                </screen> 
                in_addr ±¸Á¶Ã¼ÀÇ <emphasis>in_addr_t</emphasis> Àº  
                32 bit Å©±â¸¦ °¡Áö´Â <emphasis>unsigned long int</emphasis> ÇüÀÌ´Ù.  
            </para> 
            <para> 
                IPv6 ´Â <emphasis>sockaddr_in6</emphasis> ¶ó´Â º°µµÀÇ ±¸Á¶Ã¼¸¦  
                Á¦°øÇÑ´Ù.   
                <screen> 
#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 ÁÖ¼Ò  
} 
                </screen> 
                À§ÀÇ ±¸Á¶Ã¼ ¸â¹öÁß <emphasis>in6_addr</emphasis>°¡ 128bit ÁÖ¼Ò¸¦  
                ÀúÀåÇϱâ À§ÇÑ ±¸Á¶Ã¼ÀÌ´Ù.    
            </para> 
        </section> 
    </section> 
    <section> 
        <title>IPv6 Áö¿øÀ» À§ÇÑ ¼ÒÄÏ API</title> 
        <section> 
            <title>¼ÒÄÏ »ý¼º/¿¬°á°ü·Ã API</title> 
            <para> 
                API ¿¡¼­ Á¦°øÇÏ´Â ±âº»ÀûÀÎ ¼ÒÄÏÇÔ¼öµéÀÎ socket, bind, connect, sendmsg,  
                accept µîÀº IPv6 ¿¡¼­ ±×´ë·Î »ç¿ë°¡´ÉÇÏ´Ù.  
                ´Ù¸¸ ÇÁ·ÎÅäÄÝÁö¿ø»çÇ×°ú, »ç¿ëµÇ´Â ±¸Á¶Ã¼¿¡ À־ ¾à°£ÀÇ  
                Â÷À̰¡ ÀÖÀ» »ÓÀÌ´Ù.   
            </para> 
            <section> 
                <title>socket()</title> 
                <para> 
                    endpoint ¼ÒÄÏ Áö½ÃÀÚ¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëÇÏ´Â socket() ÇÔ¼öÀÇ °æ¿ì  
                    IPv4/TCP ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ°æ¿ì ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ°ÍÀÌ´Ù.  
                    <screen> 
s = socket(PF_INET, SOCK_STREAM, 0); 
                    </screen> 
                    IPv4/UDP ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ°æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ°ÍÀÌ´Ù.  
                    <screen>  
s = socket(PF_INET, SOCK_DGRAM, 0); 
                    </screen>  
                    IPv6 ¸¦ Áö¿øÇÏ´Â ¼ÒÄÏÀ» ¸¸µé°íÀÚ ÇÒ¶§´Â PF_INET ´ë½Å¿¡  
                    <emphasis>PF_INET6</emphasis>¸¦ »ç¿ëÇÏ¸é µÈ´Ù.   
                    <screen> 
s = socket(PF_INET6, SOCK_STREAM, 0); 
s = socket(PF_INET6, SOCK_DGRAM, 0); 
                    </screen> 
                    ÀÌ·¸°Ô ÇÔÀ¸·Î½á °£´ÜÇÏ°Ô IPv6 ¸¦ Áö¿øÇÏ´Â endpoint ¼ÒÄÏÀ» »ý¼ºÇÒ¼ö ÀÖ´Ù.  
                    ´ÙÀ½ÀÇ Äڵ带 Çѹø ÄÄÆÄÀÏÈÄ Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.   
                </para> 
                <para> 
                    <emphasis>¿¹Á¦ : ipv6_socket.c</emphasis>  
                    <screen> 
#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); 
} 
                    </screen> 
                    ¸¸¾à À§ÄÚ¸¦ ÄÄÆÄÀÏÈÄ ½ÇÇà½ÃÄ״µ¥ ¾Æ·¡¿Í °°Àº ¿¡·¯¸Þ½ÃÁö°¡  
                    Ãâ·ÂµÈ´Ù¸é ipv6 ¸ðµâÀ» ¿Ã¸®Áö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù.    
                    <screen> 
[root@localhost c_source]# ./ipv6_socket 
socket create error !! : Address family not supported by protocol 
                    </screen> 
                    ÀÌ·²°æ¿ì ipv6 ¸ðµâÀ» ¿Ã¸°´ÙÀ½ ´Ù½Ã ½ÇÇà½Ã۸é Á¦´ë·Î »ý¼ºÀÌ µÉ°ÍÀÌ´Ù.  
                    ipv6 ¸ðµâÀº modprobe ¸í·É¾î¸¦ ÀÌ¿ëÇØ¼­ ¾Æ·¡¿Í °°Àº ¹æ¹ýÀ¸·Î ÀûÀç½Ãų¼ö  
                    ÀÖ´Ù.   
                    <screen> 
[root@localhost c_source]# modprobe ipv6 
                    </screen> 
                    ¾ÕÀ¸·ÎÀÇ ¿øÇÒÇÑ Å×½ºÆ®¸¦ À§Çؼ­ Áö±Ý ipv6 ¸ðµâÀ» ÀûÀç½Ã۵µ·Ï ÇÏÀÚ.  
                </para> 
            </section> 
            <section> 
                <title>bind()</title> 
                <para> 
                    bind ´Â socket() ¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºµÈ endpoint ¿¡  
                    Æ÷Æ®¹øÈ£, ÁÖ¼Ò¿Í °°Àº ¼ÒÄÏÆ¯¼ºÀ» ¹­¾îÁÖ±â À§Çؼ­ »ç¿ëµÇ¸ç,  
                    ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î »ç¿ë°¡´ÉÇÏ´Ù. ¶ÇÇÑ »ç¿ëÇÏ´Â ±¸Á¶Ã¼¿¡ À־µµ  
                    IPv4 ¿Í Â÷À̰¡ Àִµ¥, IPv4¿ë ±¸Á¶Ã¼ÀÎ sockaddr_in ´ë½Å¿¡  
                    IPv6 ¿¡¼­ »ç¿ë°¡´ÉÇÑ sockaddr_in6 ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.     
                    <screen> 
struct sockaddr_in6 sin6; 
....  
sin6.sin6_family   = AF_INET6; 
sin6.sin6_flowinfo = 0; 
sin6_sin6_port     = htons(23); 
sin6.sin6_addr     = in6addr_any; 
.... 
if (bind(s, (struct sockaddr *)&sin6, sizeof(sin6)) == -1) 
{ 
    // ¿¡·¯Ã³¸® 
} 
.... 
                    </screen> 
                </para> 
            </section> 
            <section> 
                <title>listen()</title> 
                <para> 
                    listen ÇÔ¼öÀÇ °æ¿ì ipv4 ¿Í »ç¿ë»ó¿¡ À־ ÀüÇôÂ÷À̰¡ ¾ø´Ù.  
                    ±×³É ipv4 ¿¡ »ç¿ëÇÏ´ø ±×´ë·Î »ç¿ëÇÏ¸é µÈ´Ù.  
                    <screen>  
if (listen(sockfd, 5) == -1) 
{ 
    // ¿¡·¯Ã³¸® 
}  
                    </screen>  
                </para> 
            </section> 
            <section> 
                <title>accept()</title> 
                <para> 
                    accept ¿ª½Ã 2¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ ¼ÒÄϱ¸Á¶Ã¼ °¡ sockaddr_in À¸·Î ¹Ù²ï´Ù´Â Á¡¸¸  
                    Á¦¿ÜÇϰí´Â µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖ´Ù.   
                    <screen> 
struct sockaddr_in6 clisin6 
clisockfd = accept(sockfd, (struct sockaddr *)&clisin6,   
            (socklen_t *)&clilen); 
                    </screen> 
                </para> 
            </section> 
        </section> 
        <section id="addr"> 
            <title>ÁÖ¼Òº¯È¯°ü·Ã API</title> 
            <para> 
                ipv4 ¿¡¼­´Â ¹®ÀÚ¿­ÀÇ ÀÎÅͳÝÁÖ¼Ò¸¦ 32bit ÀÌÁø µ¥ÀÌŸ ÁÖ¼Ò·Î  
                º¯È¯Çϱâ À§Çؼ­ <emphasis>inet_addr</emphasis> À»,  
                ±×¹Ý´ë·Î 32bit ÀÌÁø µ¥ÀÌŸ ÁÖ¼Ò¸¦  
                ¹®ÀÚ¿­ÀÇ ÀÎÅͳÝÁÖ¼Ò·Î º¯È¯Çϱâ À§Çؼ­ <emphasis>inet_ntoa</emphasis>  
                ÇÔ¼ö¸¦ »ç¿ëÇß¾ú´Ù.  
            </para> 
            <para> 
                À̵é ÇÔ¼ö´Â ±âº»ÀûÀ¸·Î 32bit ÀÎÅÍ³Ý ÁÖ¼Ò¿¡ ÃÖÀûÈ­ µÈ°ªµéÀ̱⠶§¹®¿¡ 
                128ºñÆ® ÁÖ¼Òü°è¸¦ °¡Áö´Â IPv6 ÁÖ¼ÒÀÇ º¯È¯À» À§Çؼ­´Â »ç¿ëÇÒ¼ö ¾øµµ·Ï  
                ¸¸µé¾îÁ® ÀÖ´Ù.    
            </para> 
            <para> 
                ¶§¹®¿¡ Socket API ¿¡¼­´Â À̵麯ȯÀÌ °¡´ÉÇϵµ·Ï Çϱâ À§ÇÑ º°µµÀÇ  
                ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ¹®ÀÚ¿­ÀÇ IPv6 ÀÎÅͳÝÁÖ¼Ò¸¦ 128bit ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò·Î  
                º¯°æÇϱâ À§Çؼ­ <emphasis>inet_pton</emphasis>  
                ±× ¹Ý´ëÀÇ º¯°æÀ» À§Çؼ­ <emphasis>inet_ntop</emphasis> ¸¦ Á¦°øÇϴµ¥,  
                À̵é ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ »ç¿ë¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.   
            </para> 
            <section> 
                <title>inet_pton</title>     
                <para> 
                    IPv6 ¹®ÀÚ¿­ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ 128 ºñÆ® ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò·Î º¯°æÇϱâ À§Çؼ­  
                    »ç¿ëµÇ´Â ÇÔ¼öÀÌ´Ù. ÀÌÇÔ¼ö´Â IPv6 ¿¡¸¸ ƯȭµÈ ÇÔ¼ö´Â ¾Æ´Ï¸ç,  
                    ÇÁ·ÎÅäÄÝ ¹ü¿ëÀ¸·Î »ç¿ëÇÒ¼ö ÀÖµµ·Ï <emphasis>inet_addr</emphasis> ÇÔ¼ö¸¦  
                    È®Àå½ÃŲ°ÍÀ¸·Î IPv4 ¿Í IPv6 ¸ðµÎÀÇ ÁÖ¼Òº¯È¯¿¡ »ç¿ëÇÒ¼ö ÀÖµµ·Ï  
                    ¹ü¿ëÈ­ µÇ¾î ÀÖ´Ù. ´ÙÀ½Àº ÇÔ¼ö ¼±¾ðÀÌ´Ù.   
                    <screen> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
 
int inet_aton(int af, const char *src, void *dst); 
                    </screen> 
                    ù¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ <emphasis>af</emphasis>¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÅäÄÝ Á¾·ù¸¦  
                    ÁöÁ¤ÇÒ¼ö ÀÖÀ¸¸ç, µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ <emphasis>src</emphasis>°¡  
                    °¡¸£Å°´Â ÀÎÅÍ³Ý ¹®ÀÚ¿­À» ÇÁ·ÎÅäÄÝÁ¾·ù¿¡ ¸Âµµ·Ï ÀÌÁøµ¥ÀÌŸ·Î º¯°æÇؼ­  
                    <emphasis>dst</emphasis>·Î º¹»çÇÑ´Ù.  
                </para> 
                <para> 
                    ¸¸¾à À߸øµÈ ÁÖ¼ÒÀ̸§À» º¯°æÇϰíÀÚ ÇÒ°æ¿ì¿¡´Â 0ÀÌ ¸®ÅϵȴÙ.   
                </para> 
            </section> 
            <section> 
                <title>inet_ntop</title> 
                <para> 
                    inet_pton °ú ¹Ý´ëÀÇ ÀÏÀ» ÇÑ´Ù. Áï 128ºñÆ® ÀÌÁøµ¥ÀÌŸ ÁÖ¼Ò¸¦   
                    ¹®ÀÚ¿­ ÀÎÅÍ³Ý ÁÖ¼Ò·Î º¯°æÇÑ´Ù. ÀÌÇÔ¼ö ¿ª½Ã IPv6 Àü¿ëÀÇ ÇÔ¼ö´Â  
                    ¾Æ´Ï¸ç ÇÁ·ÎÅäÄÝ ¹ü¿ëÀ¸·Î »ç¿ëÇÒ¼ö ÀÖµµ·Ï <emphasis>inet_ntoa</emphasis>  
                    ¸¦ È®ÀåÇÑ ÇÔ¼öÀÌ´Ù.   
                </para> 
                <para> 
                    <screen> 
const char *inet_ntop(int af, const void *src, char *dst, size_t cnt); 
                    </screen> 
                </para> 
            </section> 
            <section> 
                <title>ÁÖ¼Òº¯°æ ¿¹Á¦</title> 
                <para> 
                    ´ÙÀ½Àº inet_pton °ú Inet_ntop ¸¦ ÀÌ¿ëÇÑ  
                    °£´ÜÇÑ ÁÖ¼Òº¯°æ ¿¹Á¦ÀÌ´Ù.  
                </para> 
                <para> 
                    <emphasis>¿¹Á¦ : addr_cp.c</emphasis> 
                    <screen> 
#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); 
} 
                    </screen> 
                </para> 
            </section> 
        </section> 
    </section> 
    <section> 
        <title>ipv6 ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ¿¹Á¦</title> 
        <para> 
            ÀÏ´Ü IPv6 ¼ÒÄÏÀ» ¸¸µé°í ¿¬°áÇϱâ À§ÇÑ ±âº»ÀûÀÎ API ¿¡ ´ëÇØ¼­ ¾Ë¾ÆºÃÀ½À¸·Î  
            ±âº»ÀûÀÎ IPv6 ±â¹ÝÀÇ ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ »óÅÂÀÌ´Ù.  
            ÀÌÁ¦ ½ÇÁ¦ IPv6 ±â¹ÝÀÇ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇØ¼­  
            Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇØº¸µµ·Ï ÇϰڴÙ.    
        </para> 
        <para> 
            ÀÛ¼ºÇϰíÀÚ ÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀº echo ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÌ´Ù.  
            ÀÌ¹Ì ¸î¹ø¿¡ °ÉÃļ­ ipv4 ¹öÁ¯¿ëÀ¸·Î Äڵ带 ¸¸µé¾îº»ÀûÀÌ ÀÖÀ½À¸·Î,  
            ÀÛµ¿¹æ½Ä¿¡ ´ëÇØ¼­´Â ¼³¸íÇÏÁö ¾Êµµ·Ï ÇϰڴÙ.    
        </para> 
        <para> 
            Å×½ºÆ®¸¦ ÇϱâÀü¿¡ ¸ÕÀú IPv6 ȯ°æÀ» ¸¸µé¾îÁà¾ß Çϴµ¥,  
            ifconfig ¸¦ ÀÌ¿ëÇØ¼­ ¼öµ¿À¸·Î IPv6 ¹øÈ£¸¦ ÇÒ´çÇÏ¿´´Ù.      
            IP ¹øÈ£´Â 3ffe:ffff:0:f101::1/128 ·Î ¼¼ÆÃÇß´Ù.  
            ifconfig ¸¦ ÅëÇÑ IPv6 ÇÒ´ç¿¡ °üÇÑ ³»¿ëÀº  
            <ulink url=/modules.php?name=News&file=article&sid=103#>IPv6(2) - ȯ°æ¼³Á¤</ulink>  
            ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.  
        </para> 
        <para> 
            ´ÙÀ½Àº ÇÊÀÚÀÇ ³×Æ®¿÷ȯ°æÀ» ifconifg ¸¦ ÅëÇØ¼­ È®ÀÎÇÑ °á°úÀÌ´Ù. 
            <screen> 
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) 
            </screen> 
        </para> 
        <para> 
            ¾Æ·¡ÀÇ ¿¹Á¦µéÀ» º¸¸é ¾Ë°ÚÁö¸¸ IPv6 ±â¹ÝÀÇ ³×Æ®¿÷ Çùֵµ  
            ¹æ¹ý·ÐÀûÀÎ °üÁ¡¿¡¼­ º¸ÀÚ¸é,   
            ±âº»ÀûÀ¸·Î IPv4 ¿Í ¿ÏÀüµ¿ÀÏÇÏ¸ç ½±°Ô ÀÛ¼º°¡´ÉÇÏ´Ù´Â°É  
            ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.  
        </para> 
        <section> 
            <title>echo ¼­¹ö</title> 
            <para> 
                ¿ì¼± ¼­¹öÃø ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ¿¡·¯Ã³¸®µîÀº ½Å°æ¾²Áö ¾Ê°í  
                ±¸Çö¿¡¸¸ ½Å°æÀ» ½è´Ù.  
            </para> 
            <para> 
                <emphasis>¿¹Á¦ echo6_s.c</emphasis> 
                <screen> 
#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); 
    } 
} 
                </screen> 
                ±¸Á¶Ã¼°¡ IPv6 °ü·Ã±¸Á¶Ã¼°¡ ¾²¿´´Ù´Â°Í°ú,  
                socket ¿¡¼­ ÇÁ·ÎÅäÄÝÀ» AF_INET6 ¸¦ »ç¿ëÇß´Ù´Â°Í ¿Ü¿¡´Â  
                IPv4 ¹öÁ¯ÀÇ echo ¼­¹ö¿Í º°Â÷À̸¦ ´À³¥¼ö ¾øÀ» °ÍÀÌ´Ù.  
            </para> 
        </section> 
        <section> 
            <title>echo Ŭ¶óÀ̾ðÆ®</title> 
            <para> 
                À̹ø¿¡´Â Ŭ¶óÀ̾ðÆ®Ãø ÇÁ·Î±×·¥ÀÌ´Ù. ¼­¹öÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î  
                ¸Å¿ì°£´ÜÇÏ´Ù.   
            </para> 
            <para> 
                <emphasis>¿¹Á¦ : echo_c.c</emphasis> 
                <screen> 
#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); 
} 
                </screen> 
                echo ¼­¹ö¸¦ ¶ç¿î´ÙÀ½¿¡ À§ÀÇ Å¬¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѼ­  
                °£´ÜÇÏ°Ô Å×½ºÆ®°¡ °¡´ÉÇÒ°ÍÀÌ´Ù.  
            </para> 
            <para> 
                À§ÀÇ ¼­¹öŬ¶óÀÌ¾ðÆ®°¡ ½ÇÇàµÈ »óÅ¿¡¼­ netstat ¸¦ ÀÌ¿ë ÇØ¼­  
                ³×Æ®¿÷ ¿¬°á»óȲÀ» »ìÆìº¸¸é ¾Æ·¡¿Í °°Àº »óÅÂÈ®ÀÎÀÌ  
                °¡´ÉÇÒ°ÍÀÌ´Ù.  
                <screen> 
[root@localhost test]# netstate -a 
... 
tcp        0      0 *:1111                  *:*                     LISTEN       
tcp        1      0 ::1:33147               3ffe:ffff:0:f101 1111 CLOSE_WAIT   
... 
                </screen> 
                IPv6 ¸¦ »ç¿ëÇÑ ¿¬°áÀÌ Á¦´ë·Î ÀÌ·ç¾îÁ³À½À» È®ÀÎÇÒ¼ö ÀÖ´Ù.  
            </para> 
        </section> 
    </section> 
</section> 
<section> 
    <title>°á·Ð</title> 
    <para> 
        ÀÌ»ó °£´ÜÇÏ°Ô IPv6 ±â¹ÝÀÇ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ±â¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù.  
        À̹®¼­¿¡¼­´Â ¸ðµç °ÍÀ» ¼³¸íÇϰí ÀÖÁö´Â ¾ÊÀ¸¸ç, IPv6 ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ»  
        À§ÇÑ °¡Àå ±âº»ÀÌ µÇ´Â ³»¿ëµé¸¸ ´Ù·ç°í ÀÖ´Ù.  
        ´õ ±íÀÌ µé¾î°¡±â ¿øÇÑ´Ù¸é °¢ÀÚ °ü·ÃÀڷḦ ã¾Æ¼­ °øºÎ¸¦ ÇØ¾ßÇÒ°ÍÀÌ´Ù.   
    </para> 
    <para> 
        ÈÄ¿¡ ¶óµµ ¸î°¡Áö ºüÁø API µé°ú, IPv6 ¿¡¼­ È®ÀåµÈ ´Ù¸¥ ±â´ÉÀ» ´Ù·ç´Â  
        ¹æ¹ý¿¡ ´ëÇÑ ³»¿ëÀ» Ãß°¡ÇÒ°ÍÀ» ¾à¼ÓÇÑ´Ù.      
    </para> 
</section> 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.