ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>IPv6_Programing
![]()
Tweet
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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|