http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=1703 [º¹»ç]
¹Ù¾ßÈå·Î ÀÎÅͳÝ/Åë½ÅÀ» ¸ð¸£¸é ÄĸÍÀ̶ó´Â ¼Ò¸± µè´Â ½Ã´ë°¡ ¿Ô´Ù. ÄÄÇ»ÅÍÀÇ ÁÖ¿ä ±â´É ¶ÇÇÑ ³×Æ®¿÷À¸·Î µÇ¾î °¡°í ÀÖ´Ù. ³×Æ®¿÷ÀÌ °Á¡ÀÎ À¯´Ð½º/¸®´ª½º°¡ ±â½ÂÀ» ºÎ¸± ¶§ÀÌ´Ù. À¯´Ð½ºÀÇ ²ÉÀ̶ó ÇÒ ¼ö ÀÖ´Â ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇÔÀ¸·Î½á ÁøÁ¤ÇÑ À¯´Ð½º ÇÁ·Î±×·¡¸Ó°¡ µÇ¾î º¸ÀÚ.
Connection-oriented socket À̶õ?
À¯´Ð½ºÀÇ ¸ðµç °ÍÀº ÆÄÀÏÀ̶ó´Â ¸»ÀÌ ÀÖ´Ù. ÀÌ ¸»Àº À¯´Ð½º ÇÁ·Î±×·¡¹ÖÀ» ÇØ º¸¸é ¸ðµç I/OÀÛ¾÷ÀÌ ÆÄÀÏ¿¡ ¾²°í ÀÐÀ½À¸·Î½á ÀÌ·ç¾î Áø´Ù´Â ¸»ÀÌ´Ù. ³×Æ®¿÷ÀÇ ÀÛµ¿ ¶ÇÇÑ ¸¶Âù°¡ÁöÀÌ´Ù. ¾çÂÊÀÇ ÄÄÇ»ÅÍ°¡ °¢°¢ ÆÄÀÏ, Áï socket À» ¿¾î¼ ±× ÆÄÀÏÀ» ¿¬°á½ÃÄÑ Åë½ÅÀÌ ÀÌ·ç¾îÁö´Â °ÍÀÌ´Ù.
ÁÖ·Î ¾²ÀÌ´Â socketÀÇ Å¸ÀÔÀº 2Á¾·ùÀÌ´Ù. Çϳª´Â stream socket ÀÌ°í ´Ù¸¥ Çϳª´Â datagram socket ÀÌ´Ù.
Stream socketÀº ¾ÈÁ¤ÀûÀÎ ¾ç¹æÇâÀÇ ¿¬°áÀ» ¸¸µé ¶§ ÇÊ¿äÇÑ ¼ÒÄÏÀÌ´Ù. ÀÌ ¿¬°áÀº ¾ç¹æÇâÀ¸·Î Åë½ÅÀÌ °¡´ÉÇϸç, µ¥ÀÌÅ͵éÀÇ ¼ø¼°¡ Á¤È®ÇÏ´Ù. ¶ÇÇÑ ÀÌ ¿¬°áÀº tcp ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇϹǷΠ¿¡·¯ üŷÀÌ µÇ¾î ¾ÈÁ¤ÀûÀÎ µ¥ÀÌÅÍ Àü¼ÛÀÌ °¡´ÉÇÏ´Ù. telnet À̳ª http.ftp µî°ú °°ÀÌ »óÈ£ ÀÛ¿ëÀÌ ÇÊ¿äÇÏ°í ¾ÈÁ¤ÀûÀÎ ¿¬°áÀÌ ¿ä±¸µÉ ¶§ ¹Ù·Î ÀÌ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù. ÀÌ ¼ÒÄÏÀ» ´Ù¸¥ ¸»·Î connection-oriented socket À̶ó°íµµ ÇÑ´Ù.
̉˜ http://www.lug.or.kr/docs/LINUX/others/1997-1.htm
¹Ý¸é datagram socketÀº ´Ü¹æÇâ ÀÏȸ¼ºÀ̶ó ÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ packet(µ¥ÀÌÅÍ µ¢¾î¸®)¿¡ ÁÖ¼Ò¸¦ Áý¾î³Ö¾î º¸³»¸é ±× ÆÐŶÀÌ È¥ÀÚ¼ ¸ñÀûÁö·Î ã¾Æ°¡´Â ¹æ½ÄÀÌ´Ù. ÀÌ·¸±â ¶§¹®¿¡ ¿¬°áÀ» ½ÃÄѳõÀ» ÇÊ¿ä°¡ ¾ø¾î ÀÏȸ¼ºÀ̸ç, ÀÌ ÆÐÆÂÀÌ Àü¼Û µµÁß ºÐ½ÇµÉ ¼öµµ ÀÖ´Ù. tftp³ª bootp°°Àº ÇÁ·Î±×·¥ÀÌ ÀÌ·¯ÇÑ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù.
ÀÌ °Á¿¡¼ ¿ì¸®´Â ¸î °¡Áö ¿¹Á¦¸¦ ÅëÇÏ¿© connection-oriented socket¿¡ ´ëÇØ ½ÉµµÀÖ°Ô °øºÎ¸¦ ÇÏ°Ô µÉ °ÍÀÌ´Ù.
¼ÒÄÏ °ü·Ã ½Ã½ºÅÛ È£Ãâ
connection-oriented socketÀ» ¸¸µé¾î ¿¬°áÀ» Çϱâ À§Çؼ´Â ´ÙÀ½°ú °°Àº °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.
Server: socket() -> bind() ->listen() -> accept()
Client: socket() -> connect()
ÀÌ ½Ã½ºÅÛ È£ÃâµéÀº ´ëºÎºÐ sockaddr ±¸Á¶Ã¼¸¦ Àμö·Î ÇÊ¿ä·Î ÇÑ´Ù. sockaddr ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°´Ù.
#include <sys/socket.h>
struct sockaddr
{
unsigned short sa_family; /* addressmfamily, AF_xxx */
char sa_data[14]; /*14bytes of protocol address */
};
¿©·¯ Á¾·ùÀÇ ¼ÒÄÏÀÌ °°Àº ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇϱ⠶§¹®¿¡ sockaddr ±¸Á¶Ã¼¿¡¼ ¼ÒÄÏ Á¾·ù¿¡ ÀÇÁ¸ÀûÀÎ ºÎºÐÀº sa_data[]¿Í °°ÀÌ ¹è¿·Î ³²°Ü µÎ¾ú´Ù. Sa_family´Â ÇÁ·ÎÅäÄÝÀÇ Á¾·ù¸¦ °áÁ¤ÇÏ´Â °ÍÀ¸·Î, ¿ì¸®°¡ »ç¿ëÇÒ °ÍÀº AF_inet(Internetfamily) ÀÌ´Ù. familyÀÇ Á¾·ù·Î´Â af_INET ¿Ü¿¡ AF_UNIX, AF_NSµîÀÌ ÀÖ´Ù.
AF_INET family¸¦ À§ÇØ ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼°¡ sockaddr±¸Á¶Ã¼¸¦ ÁöÁ¤Çϱâ À§ÇØ Á¤ÀǵǾî ÀÖ´Ù.
#include <netinet/in.h>
struct sockaddr_in
{
short int sin_family; /Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /*internet address */
unsigned char sin \_zero[8]; /*Same size as struct sockaddr*/
};
struct in_addr
{
unsigned long s_addr;
}
sin_family´Â AF_INET·Î ÁöÁ¤µÉ °ÍÀ̸ç, sin_port´Â Æ÷Æ®¹øÈ£, sin_addrÀº ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. Sin_zero[]´Â sockaddr°ú Å©±â¸¦ ¸ÂÃß±â À§ÇÑ ¹è¿À̱⠶§¹®¿¡ sockaddr_inÀ» »ç¿ëÇϱâ Àü¿¡ bzero()³ª memset()À» ÀÌ¿ëÇؼ 0À¸·Î ÃʱâÈÇÑ´Ù.
Byte Ordering Routine
ÄÄÇ»ÅÍ ¸¶´Ù byteµéÀ» º¯¼ö¿¡ ÀúÀåÇÏ´Â ¼ø¼°¡ ´Ù¸£´Ù. ±×·¡¼ ´Ù¸¥ ÄÄÇ»Åͳ¢¸® Åë½ÅÀÌ ÀÌ·ç¾î Áö·Á¸é ÀÌ·¯ÇÑ ¼ø¼¸¦ ¸ÂÃç ÁÖ¾î¾ß ÇÑ´Ù. ³×Æ®¿÷ »ó¿¡¼ÀÇ µ¥ÀÌÅÍÀÇ byte order¸¦ Network byte order¶ó°í Çϸç, ÄÄÇ»ÅÍ ³»ºÎ¿¡¼ »ç¿ëµÇ´Â byte order¸¦ host byte order¶ó°í ÇÑ´Ù. ±×·¯¹Ç·Î sin_addr¿¡ µé¾î°¥ ¼ýÀÚ´Â network byte order ÀÌ´Ù. ¿ì¸®°¡ sin_port¿Í sin_addr¿¡ °ªÀ» ÁöÁ¤ÇÏ·Á¸é ÄÄÇ»ÅÍÀÇ host byte orderÀÎ º¯¼ö °ªÀ» network byte order ·Î ¹Ù²Ù¾î¼ ÀúÀåÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ¼ø¼ º¯È¯ ÇÔ¼ö´Â 4°¡Áö°¡ ÀÖ´Ù.
htons()-"Host to Network Short"
htonl()-"Host to Network Long"
ntohs()-"Network to Host Short"
ntohl()-"Network to Host Long"
À̸§ ±×´ë·Î htons() ´Â short ÇüÀÇ º¯¼ö¸¦ host byte order¿¡¼ network byteorder·Î ¹Ù²ãÁØ´Ù. ³ª¸ÓÁöµµ ¸¶Âù°¡ÁöÀÌ´Ù.
Sa¶ó´Â sockaddr_in ±¸Á¶Ã¼¿¡¼ sin_port¿¡ 4000 À̶ó´Â ¹øÈ£¸¦ ÁöÁ¤ÇÏ·Á¸é sa.sin_port = htons(4000); ÀÌ·¸°Ô ÇÏ¸é µÈ´Ù. sin_port´Â shortÇü À̹ǷΠhtons()¸¦ »ç¿ëÇÏ¿´´Ù.
Address Conversion Routine
IP ¾îµå·¹½ºÀÇ ÁöÁ¤À» À§Çؼ´Â sin_addr.s_addr¿¡ ÁÖ¼Ò¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. sa¶ó´Â sockaddr-in ±¸Á¶Ã¼°¡ ÀÖ´Ù°í ÇÏÀÚ. ¿©±â¿¡ "127.0.0.1"¶ó´Â ÁÖ¼Ò¸¦ ÁöÁ¤ÇÏ°í ½ÍÀ» ¶§¿¡´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
sa.sin_addr.s_addr =inet_addr("127.0.0.1") ;
inet_addr()ÇÔ¼ö´Â ¼ýÀÚ¿Í Á¡À¸·Î ÀÌ·ç¾îÁø ÁÖ¼Ò °ªÀ» unsigned longÀÇ ÇüÅ·Π¹Ù²Ù¾î ÁØ´Ù. ÀÌ ÇÔ¼ö´Â ¹Ì¸® Network byte order·Î ¹ÝȯÀ» ÇϹǷΠhtonl()°ú °°¤·´À ÇÔ¼ö¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
ÀÌ¿Í ¹Ý´ëÀÇ ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼ö´Â inet_ntoa()ÀÌ´Ù. ÀÌ ÇÔ¼ö´Â unsigned longÀÇ ÁÖ¼Ò°ªÀ» µµÆ®·Î ÀÌ·ç¾îÁø ÁÖ¼Ò°ªÀ¸·Î ¹Ù²Ù¾î ÁØ´Ù.
printf("%s",inet_ntoa(sa.sin_addr));
°ú °°ÀÌ Çϸé 127.0.0.1ÀÌ ÂïÈú °ÍÀÌ´Ù.
¾ÆÁ÷Àº home.monac.org°ú °°ÀÌ ¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò°ªÀº ´Ù·çÁö¸¦ ¸øÇÑ´Ù. ÀÌ°Í¿¡ ´ëÇؼ´Â ³ªÁß¿¡ »ìÆ캸±â·Î ÇÏ°Ú´Ù.
socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int family, int type, int protocol);
family´Â ¼ÒÄÏ °¡Á·À» ÁöÁ¤ÇÏ´Â ºÎºÐÀÌ´Ù. ¿ì¸®´Â AF_INET¸¸À» »ç¿ëÇÑ´Ù.
typeÀº stream socketÀ̶ó´Â °ÍÀ» ¸»ÇÏ´Â SOCK_STREAMÀ¸·Î ÁöÁ¤À» ÇÑ´Ù.
ptocolÀº 0À» ÁöÁ¤ÇÑ´Ù.
ÀÌ ½Ã½ºÅÛ È£ÃâÀº ÆÄÀÏ ÁöÁ¤¹øÈ£(file descriptor)¸¦ ¹ÝȯÇÑ´Ù.
¿ì¸®´Â ÀÌ ÇÔ¼ö È£ÃâÀ» ´ÙÀ½Ã³·³¸¸ ¾²°Ô µÉ °ÍÀÌ´Ù.
sckfd =socket(AF_INET,SOCK_STREAM,0);
bind()
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, int addrlen);
myaddrÀº ÀÚ±â ÀÚ½ÅÀÇ ÁÖ¼ÒÀÌ´Ù.
AddrlenÀº myaddrÀÇ Å©±â¸¦ ¸»ÇÑ´Ù. Sizeof(myaddr)°ú °°ÀÌ ¾²¸é µÉ °ÍÀÌ´Ù. ÀÌ ½Ã½ºÅÛ È£ÃâÀº ¼ÒÄÏ¿¡ ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. ¼¹ö´Â Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ¿¬°á ¿ä±¸¸¦ ¹Þ±â Àü¿¡ ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤ÇØ ÁÜÀ¸·Î½á ÀÌ ÁÖ¼Ò·Î ¿À´Â ½ÅÈ£´Â ¸ðµÎ ÀÌ ¼ÒÄÏÀ¸·Î µé¾î¿À¶ó°í ¸»ÇØ ÁÖ´Â °ÍÀÌ´Ù.
lsten()
int listen(int sockfd, int baklog);
backlog´Â accept() ÇѼö ½ÇÇà ½Ã¿¡ ¾ó¸¶³ª ¸¹Àº ¿¬°áÀÌ ´©ÀûµÉ ¼ö Àִ°¡¸¦ ¸»ÇÑ´Ù. µ¿½Ã¿¡ 2°³ÀÇ ¿¬°á ¿ä±¸°¡ ¹ß»ýÇÒ ¶§ accept()¿¡¼ ÇϳªÀÇ ¿¬°áÀ» ¹Þ¾ÆµéÀÌ´Â µµÁß¿¡´Â ´Ù¸¥ Çϳª´Â ´©Àû(pending)µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ´©ÀûµÇ´Â ¿¬°áÀÇ °³¼ö¸¦ ÀǹÌÇÑ´Ù. º¸Åë ÃÖ´ë°ªÀÌ 5°³ÀÌ´Ù.
Accept()
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr * peer,int *addrlen);
peer´Â ¿¬°áÀÌ ¼º¸³µÇ¾úÀ» ¶§ ¿¬°áµÈ »ó´ë¹æÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÒ °ø°£ÀÌ´Ù. ÀÌ ½Ã½ºÅÛ È£ÃâÀº ½ÇÁ¦ÀûÀÎ ¿¬°áÀ» ±â´Ù¸®´Â ÇÔ¼öÀÌ´Ù. ¿¬°á ¿äûÀÌ ÀÖÀ» °æ¿ì accept()´Â »õ·Î¿î ¼ÒÄÏÀ» »ý¼ºÇÏ°í ¿¬°áÇÏ¿©, ÀÌ ÆÄÀÏ ÁöÁ¤¹øÈ£¸¦ ¹ÝȯÇÑ´Ù. ¿¬°á ¿äûÀÌ ¾øÀ¸¸é non-blocking ¼ÒÄÏÀÌ ¾Æ´ÑÇÑ ¿¬°áÀ» ±â´Ù¸°´Ù. Non-blocking¼ÒÄÏ¿¡ ´ëÇؼ´Â ´ÙÀ½¿¡ »ìÆ캸±â·Î ÇÑ´Ù.
connect()
#include <sys/types.h>
#include < sys/socket.h>
int connect(int sockfd, struct sockaddr *servaddr, int addrlen);
servaddrÀº ¿¬°áÀ» ÇÒ »ó´ë¹æÀÇ ÁÖ¼ÒÀÌ´Ù.
ÀÌ ½Ã½ºÅÛ È£ÃâÀº ÀÚ½ÅÀÇ ½Ã½ºÅÛ°ú ¼¹öÀÇ ½ÇÁ¦ÀûÀÎ ¿¬°áÀ» ½ÃµµÇÑ´Ù.
Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº socket() ½Ã½ºÅÛ È£Ãâ ÈÄ ÀÌ ½Ã½ºÅÛ È£Ãâ·Î ¼¹ö¿¡ ¿¬°áÀ» ½Ãµµ ÇÒ °ÍÀÌ´Ù.
socketÀ» ÅëÇÑ read/write
¼ÒÄÏÀº ÇϳªÀÇ ÆÄÀÏÀ̹ǷΠ¸ðµç ÆÄÀÏ I/O ÇÔ¼öµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿©±â¼ ¿ì¸®´Â read(), write() ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù.
¼ÒÄÏÀ» ÅëÇÏ¿© read()/write()¸¦ ½ÃµµÇÏ¿´À» °æ¿ì ¸®ÅÏ°ª(½ÇÁ¦·Î ÀÐÇôÁø ¶Ç´Â ¾²¿©Áø byte ¼ö)ÀÌ ¿ì¸®°¡ ÁöÁ¤ÇÑ byte¼ö º¸´Ù ÀÛÀ» ¼öµµ ÀÖ´Ù. ÀÌ·² °æ¿ì¿¡´Â ´Ù ¾²¿©Áú ¶§ ±îÁö ¹Ýº¹Çؼ ½ÃµµÇØ¾ß ÇÒ °ÍÀÌ´Ù.
¼ÒÄÏ ¿¬°áÀÌ ²÷°ÜÁú °æ¿ì´Â ´ÙÀ½°ú °°ÀÌ ¾Ë ¼ö ÀÖ´Ù.
1. »ó´ë¹æÀÌ ´ÝÇôÁø ¼ÒÄÏ¿¡ read()¸¦ ½ÇÇàÇϸé 0À» ¸®ÅÏÇÑ´Ù.
2. »ó´ë¹æÀÌ ´ÝÇôÁø ¼ÒÄÏÀÌ write()¸¦ ½ÇÇàÇϸé SIGPIPE½Ã±×³ÎÀÌ ¹ß»ýÇÑ´Ù.
ÀÌ ½Ã±×³ÎÀÌ ¹«½ÃµÇ°Å³ª ÀÌ ½Ã±×³ÎÀ» À§ÇÑ ½Ã±×³Î Çڵ鷯°¡ ¼³Ä¡µÇ¾úÀ» °æ¿ì¿¡´Â ¿¡·¯°¡ ¹ß»ýÇÏ°í(-1À» ¸®ÅÏ), errno°¡ EPIPE·Î ¼¼ÆõȴÙ.
socketÀ» À§ÇÑ ÀÔÃâ·Â ¹öÆÛÀÇ Å©±â´Â PIPE_BUF»ó¼ö°ªÀÌ´Ù. È¿À²ÀûÀÎ ÀÔÃâ·ÂÀ» À§Çؼ PIPE_BUF Å©±â¸¸ÅÀ» ¾²°Å³ª Àд °Íµµ ÁÁÀ» °ÍÀÌ´Ù. ÀÌ ¹öÆÛ Å©±â´Â ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù.
echo ¼¹ö ÇÁ·Î±×·¥
ÀÌ ¼¹ö ÇÁ·Î±×·¥Àº Æ÷Æ® 4000¹øÀ¸·ÎºÎÅÍ ¿¬°áÀ» ¹Þ¾Æµé¿©¼, µ¥ÀÌÅ͸¦ ÀÐ°í ±×°ÍÀ» µµ·Î ¹Ý¼ÛÇÏ´Â ÀÛ¾÷À» ¹Ýº¹ÇÑ´Ù.
/*echo server*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define ECHO_PORT4000
int newsock:
void quit(int)
void main()
{
int sock, clilen;
struct sockaddr_in cli_addr,serv_addr;
char buf[100];
int n;
/* internet °¡Á·ÀÇ stream socketÀ» ÇÒ´ç¹Þ´Â´Ù. */
if((sock = socket(AF_INET,SOCK_STREAM,0)) <0)
{
perror("socket");
exit(1);
}
/*ÀÎÅÍ·´Æ®(CNTL-C)½Ã¿¡ Á¾·áÀÛ¾÷À» ÇÒ ¼ö ÀÖ°Ô Çڵ鷯¸¦ ¼³Ä¡ÇÑ´Ù.*/
signal(SIGINT,quit);
/*sockaddr_in ±¸Á¶Ã¼¸¦ »ç¿ëÇϱâ Àü¿£ 0À¸·Î ÃʱâÈ ÇØÁÖ¾î¾ß ÇÑ´Ù. */
bzero((char*) &serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
/* INADDR_ANY: 0ÀÇ °ª -> ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦ ÄÄÇ»ÅÍ°¡ ã¾ÆÁØ´Ù. */
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(ECHO_PORT);
/*bind local address */
if(bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) <
0)
{
perror("bind");
close(sock);
exit(1);
}
listen(sock, 0);
clilen = sizeof(cli_addr);
printf("accepting...\n");
/* ¿©±â¼ ¿¬°á¿äûÀÌ ¿Ã ¶§±îÁö block µÈ´Ù. */
newsock = accept(sock, (struct sockaddr*) & cli_addr, &clilen);
close(sock);
if(newsock<0)
{
perror("accept");
exit(1);
}
printf("Connected from %s.\n", inet_ntoa(cli_addr.sin_addr));
while((n = read(newsock, buf, 100)) ! = 0)
{
if(n < 0)
{
perror("read");
close(newsock);
exit(1);
}
write(newsock, buf, n);
write(1, buf, n);
}
close(newsock);
printf("Connection closed by the peer.\n");
}
void quit(int signum)
{
close(newsock);
printf("interrupted\n");
exit(1);
}
ÇÁ·Î±×·¥ÀÇ È帧Àº ¼ÒÄÏÀ» ¸¸µé°í, sock=socket(AF_INET, SOCK_STREAM, 0);
ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦ ¼ÒÄÏ¿¡ ÇÒ´ç,
bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
¿¬°áÀ» ¹Þ¾ÆµéÀÌ°Ú´Ù´Â ÀÇÁö·Î listen()À» È£ÃâÇÏ°í,
backlog¸¦ 0À¸·Î ÁöÁ¤, listen(sock, 0);
½ÇÁ¦ ¿¬°áÀ» ¹Þ¾ÆµéÀδÙ.
Newsock=accept(sock, (struct sockaddr*) &cli_addr, &clilen);
³¡³¾ ¶§ close()·Î ¼ÒÄÏÀ» ´Ý´Â´Ù.
Serv_addr.sin_addr.s_addr¿¡´Â ÀÚ±â ÀÚ½ÅÀÇ ÁÖ¼Ò°¡ µé¾î °¡¾ß µÈ´Ù. ±×·¯³ª ÀÌ°ÍÀ» INADDR_ANY·Î ÁöÁ¤Çϸé, ÀÚ½ÅÀÇ ÁÖ¼Ò¸¦ ÀÚµ¿À¸·Î ã¾ÆÁØ´Ù.
ECHO_PORT¸¦ 4000À¸·Î ÁöÁ¤ÇÏ¿© ¿ì¸®´Â 4000¹øÀÇ Æ÷Æ®·Î Á¢¼ÓÀ» ¹Þ´Â´Ù´Â °ÍÀ» ¸í½ÃÇÏ¿´´Ù. Æ÷Æ®¹øÈ£ 1-1023±îÁö´Â ¿¹¾àµÈ Æ÷Æ®ÀÌ´Ù. Áï 1-1023±îÁöÀÇ Æ÷Æ®´Â ½Ã½ºÅÛÀÌ »ç¿ëÇÏ´Â Æ÷Æ®À̱⠶§¹®¿¡ »ç¿ëÀÚ ÀÓÀÇÀÇ Æ÷Æ®·Î »ç¿ëÇÒ ¼ö °¡ ¾ø´Ù. ±×·¡¼ ¿ì¸®°¡ »ç¿ë ÇÒ ÇÁ·Î±×·¥Àº 1024-65535±îÁöÀÇ Æ÷Æ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
Listen() ½Ã½ºÅÛ È£Ãâ¿¡¼ backlog°ªÀ¸·Î 0À» ÁöÁ¤ÇÏ¿´´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¿¬°áÀ» Çϳª¸¸ ¹Þ¾ÆµéÀ̹ǷΠbacklogÀÇ °ªÀº ÇöÀç ¹«ÀǹÌÇÏ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÀÐ¾î¼ ±× µ¥ÀÌÅ͸¦ µÇµ¹·Á º¸³»ÁÖ¸ç µ¿½Ã¿¡ standard output(ÆÄÀÏÁöÁ¤¹øÈ£ 1)À¸·Î Ãâ·ÂÇÑ´Ù. Read()½Ã¿¡ ¸®ÅÏ°ªÀÌ 0À̸é Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÀ» ²÷¾ú´Ù´Â °ÍÀ» ¶æÇÑ´Ù.
Socket()À¸·Î ¼ÒÄÏÀ» »ý¼ºÇÑ µÚ¿¡´Â ÇÁ·Î±×·¥À» ³¡³»±â Àü¿¡ close()¸¦ ÇÑ µÚ¿¡´Â ¼ÒÄÏÀ» ´Ù½Ã »ç¿ëÇÒ ¼ö´Â ¾øÁö¸¸ ±×·¸´Ù°í ¼ÒÄÏÀÌ °ð¹Ù·Î ¾ø¾îÁö´Â °ÍÀº ¾Æ´Ï´Ù. ¼ÒÄÏÀº Ä¿³Î ³»ºÎ¿¡¼ Àá½Ãµ¿¾È »ì¾Æ ÀÖÀ¸¸é¼ »ó´ëÆí°úÀÇ Åë½ÅÀ¸·Î ¼ÒÄÏÀ» ¿ÏÀüÈ÷ ´Ý´Â´Ù. ¼¹ö ¼ÒÄÏÀº ÀÌ °úÁ¤¿¡¼ ´Ù¼Ò ½Ã°£ÀÌ °É¸± ¼ö ÀÖ´Ù. ±×·¡¼ ¼¹ö¸¦ Á÷Á¢ Á¾·á ½ÃŲ µÚ¿¡ °ð¹Ù·Î ´Ù½Ã ½ÇÇà½ÃÅ°¸é "address already in use"¿Í °°ÀÌ Àü¿¡ ¾²ÀÌ´ø ¼ÒÄÏÀÌ ¿ÏÀüÈ÷ ´ÝÇôÁöÁö ¾Ê¾Æ ¿¡·¯°¡ ³¯ ¼ö ÀÖ´Ù. (º¸Åë ¸î ºÐ ÀÌ»óÀº ¾È °É¸°´Ù.).
ÀÌÁ¦ ÀÌ ÇÁ·Î±×·¥À» Å×½ºÆ® Çغ¸ÀÚ.
ÀÌ ÇÁ·Î±×·¥Àº ÇöÁ¦ Æ÷Æ®¹øÈ£ 4000À¸·Î Á¢¼ÓÀ» ¹Þ°í ÀÖ´Ù. ¿ì¸®´Â telnet°°Àº ÇÁ·Î±×·¥À¸·Î Æ÷Æ® 4000¿¡ Á¢¼ÓÀ» ÇÒ ¼ö ÀÖ´Ù.
ÇÑ Äֿܼ¡¼ ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ µÚ¿¡ ´Ù¸¥ Äֿܼ¡¼ telnet localhost 4000°ú °°ÀÌ Á¢¼ÓÀ» ½ÃµµÇضó.
ÁÖ¼Òº¯È¯Çϱâ
www.linux-kr.org°ú °°ÀÌ ¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò´Â 127.0.0.1°ú °°ÀÌ ¼ýÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò·Î º¯È¯µÇ¾î¼ 󸮵Ǿî¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷Àº DNS(Domain Name Service)¿¡ ÀÇÇØ ½Ã½ºÅÛ¿¡¼ ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥¿¡¼ À̸¦ ÀÌ¿ëÇϱâ À§Çؼ´Â gethostbyname() À̶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
#define h_addr h_addr_list[0]
gethostbyname()Àº ¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò¸¦ Àμö·Î ¹Þ¾Æ¼ hostent ±¸Á¶Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼ÀÇ ÀÌ¿ë ¿¹¸¦ ÅëÇØ »ç¿ë¹ýÀ» »ìÆ캸ÀÚ.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
struct hostent *h;
if (argc ! =2)
{
fprintf(stderr,"usage: %s address\n" ,argv[0]);
exit(!);
}
if ((h=gethostbyname(argv[1])) == NULL
{
herror("gethostbyname");
exit(1);
}
printf("Host name : %s\n" , h->h_name);
printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));
return 0;
}
¿©±â¼ º¼ ¼ö ÀÖµíÀÌ h_nameÀº ¹®ÀÚ·Î ÀÌ·ç¾îÁø È£½ºÆ®ÀÇ À̸§À», h_addrÀº in_addrÇö ±¸Á¶Ã¼¿¡ µé¾î°¥ Network byte orderÀÎ ¼ýÀÚ¸¦ ÀúÀåÇÑ´Ù. h_addrÀº ½ÇÁ¦ÀûÀ¸·Ð h_Addr_list[0]ÀÇ ¸ÅÅ©·ÎÀÌ´Ù.
h_addrÀ» sa¶ó´Â sockaddr_in±¸Á¶Ã¼¿¡ Àû¿ë½ÃÅ°·Á¸é, bcopy(h->h_addr,(char*)&sa.sin_addr, host->h_length);°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
¿©±â¼ genthostbyname()¿¡ ¿¡·¯°¡ ¹ß»ýÇÏ¿© NULLÀ» ¹ÝȯÇÒ ¶§ perror()°¡ ¾Æ´Ñ herror()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´´Ù. ÀÌ´Â gethostbyname()Àº ¿¡·¯ ½Ã¿¡ errno°¡ ¾Æ´Ñ h_errno¿¡ ¿¡·¯¸¦ ¼¼ÆÃÇϹǷÎ, perror() ´ë½Å herror()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¿¡·¯ ³»¿ëÀ» È®ÀÎÇÑ´Ù.
<ÁÖ¼Òº¯È¯ ¾Ë°í¸®Áò>
--------------------------------------------------------------------------------
| struct sockaddr_in [ struct in_addr sin_addr] |
--------------------------------------------------------------------------------
^^^ ^^^
| |
| gethostbyname() ->h_addr | inet_addr()
| |
www.linux-kr.org----------------> 127.0.0.1
inet_ntoa()
echo Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥
Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº ¼ÒÄÏ ¿¬°á ÈÄ fork()¸¦ ½ÇÇà½ÃŲ´Ù. fork()°¡ ½ÇÇàµÇ¸é Àڽİú ºÎ¸ð´Â ÇϳªÀÇ ¼ÒÄÏÀ» µ¿½Ã¿¡ ¿¾î ³õÀ» ¼ö ÀÖÀ¸¹Ç·Î, ÇϳªÀÇ ¼ÒÄÏ¿¡ Àбâ¿Í ¾²±â¸¦ µ¿½Ã¿¡ ¼öÇàÇÒ ¼ö ÀÖ´Ù. ÀÚ½Ä ÇÁ·Î¼¼¼´Â ¼¹ö·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÀÐ¾î¼ Ãâ·ÂÇÏ´Â ÀÛ¾÷À» ¹Ýº¹ÇÑ´Ù. ºÎ¸ð ÇÁ·Î¼¼¼´Â Å͹̳ÎÀ» cbreak ¸ðµå·Î ÀüȯÇÑ µÚ ÀÔ·ÂµÈ ¹®ÀÚ¸¦ °ð¹Ù·Î ¼¹ö¿¡ Àü¼ÛÇÏ´Â ÀÛ¾÷À» ¹Ýº¹ÇÑ´Ù. cbreak¸ðµå¿¡¼´Â ÀÚ½ÅÀÌ Ä£ ¹®ÀÚ¸¦ ȸ鿡 Ç¥½ÃÇÏÁö ¾Ê°í, Çѹø¿¡ ÇÑ ¹®ÀÚ¾¿ ÀÐ¾î µéÀδÙ(echo off, noncanonical input).
ÀÌ ÇÁ·Î±×·¥¿¡¼ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ º¯È¯ÇÏ´Â °úÁ¤¿¡ À¯ÀÇÇÏ¿©¶ó.
/* echo client*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <termios.h>
#define ECHO_PORT 4000
int tty_cbreak(int fd, int set);
void main(int argc, char *argv[])
{
int sock,child_paid;
struct hostent *host;
struct sochaddr_in serv_addr;
int port;
char addr[50];
char hostname[50];
char buf[100];
if(argc ! = 2)
{
fprintf(stderr,"usage: %s<address>¡¬n",argv[0]);
exit(1);
}
strcpy(addr,argv[1]);
port = ECHO_PORT;
bzero((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port = htons(port);
/*¼ýÀÚ¿Í Á¡À¸·Î ÀÌ·ç¾îÁø ÁÖ¼ÒÀÎÁö üũÇÑ´Ù.*/
if ((serv_addr.sin_addr.s_addr=inet_addr(addr))!=INADDR_NON
E)
{
strcpy(hostname,addr);
}
else
{/*¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò°ª À̹ǷÎ, µ¥ÀÌÅͺ£À̽º¿¡¼ ÁÖ¼Ò¸¦ ã´Â´Ù.*/
if ((host=gethostbyanme(addr))==NULL)
{
herror("host name error");
exit(1);
}
bcopy(host->h_addr,(char *)&serv_addr.sin_addr,
host->h_length);
strcpy(hostname, host->h_name);
}
/*¼ÒÄÏ »ý¼º*/
if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
printf("Trying %s...¡¬n",inet_ntoa(serv_addr.sin_addr));
/*¼¹ö·Î ¿¬°áÀ» ½ÃµµÇÑ´Ù. */
if(connet(scok,(struct sockaddr*) &serv_addr, sizeof(serv_addr))
<0)
{
close(sock);
perror("connect");
exit(1);
}
printf("Connected to %s.¡¬, honstname);
if((child_pid = fork()) ==0)
{/*this is the child process*
int n;
while((n = read(sock, buf, 100)) !=0)
write(1,buf,n);
if(kill(getppid(), SIGKILL)<0)
perror("kill");
}
else
{
/*this is the parent process*/
int n;
/* cbreak-mode·Î ¸¸µç´Ù.*/
tty_cbreak(fileno(stdin),1);
while((n = read(fileno(stdin),buf,1)) == 1
{
if((n = write(sock, buf, 1)) <0)
break;
}
if(n<0)
fprintf(stderr, "error!¡¬n");
/*terminal mode º¹±Í½ÃŲ´Ù.*/
tty_cbreak(fileno(stdin),0);
kill(child_pid, SIGKILL);
}
close(sock);
printf("Connection closed.¡¬n");
}
/*cbreak mode*/
int tty_cbreak(int fd, int set)
{
static struct termios save_termios;
struct termios buf;
/*setÀÌ 1À̸é cbreak mode·Î Àüȯ, 0À̸é ÀÌÀüÀÇ ¸ðµå·Î µÇµ¹¸²*/
if(!set)
{
if(tcsetattr(fd, TCSAFLUSH, &save_termios)<0)
return -1;
return 0;
}
if(tcgetattr(fd, &save_termios)<0)
return -1;
buf = save_termios;
buf.c_lflag &=~(ECHO | ICANON);
buf.c_cc[VMIN] = 1;
buf.c_cc[VTIME] = 0;
if(tcsetattr(fd, TCSAFLUSH, &buf)<0)
return -1;
return 0;
}
ÁÖ¼Ò¸¦ º¯È¯ÇÏ´Â °úÁ¤À» »ìÆ캸ÀÚ.
If((serv_addr.sin_addr.s_addr=inet_addr(addr))!=INADDR_NONE)
{
strcpy(hostname,addr);
}
¸¸¾à addrÀÌ "127.0.0.1"°ú °°ÀÌ ¼ýÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼Ò°ªÀ̶ó¸é inet_addr()ÇÔ¼ö´Â Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÑ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì´Â INADDR_NONE(-1)¶ó´Â °ªÀÌ ¸®ÅϵȴÙ. ¿¡·¯³ª ³µÀ¸¸é ¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼ÒÀÎÁö¸¦ üũÇÑ´Ù.
else
{
if((host=gethostbyname(addr))==NULL)
{
herror("host name error");
exit(1);
}
bcopy(host->h_addr,(char *) &serv_addr.sin_addr,host-
>h_length);
strcpy(hostname, host->h_name);
}
gethostbyname()ÇÔ¼ö°¡ ¼º°øÀ» ÇÏ¸é ¿ì¸®´Â host->h_addrÀ» serv_addr.sin_addr¿¡ º¹»çÇÏ¿© serv_addr ±¸Á¶Ã¼¸¦ ¿Ï¼º½Ãų ¼ö ÀÖ´Ù. HostnameÀº ¹®ÀÚ·Î ÀÌ·ç¾îÁø ÁÖ¼ÒÀÇ ¿ÏÀüÇÑ °ªÀ» °¡Áø´Ù.(¸ÅÅ©·Î °°Àº À̸§ÀÌ ¾Æ´Ñ...)
Àڽİú ºÎ¸ð ÇÁ·Î¼¼¼ µÎ°³¸¦ µ¿½Ã¿¡ ³¡³»±â À§ÇØ ¼·Î¿¡°Ô KILL½Ã±×³ÎÀ» º¸³½´Ù. ¾î´À°ÍÀÌ ¾ðÁ¦ ¾î¶»°Ô Á¾·á µÉÁö ¾Ë ¼ö°¡ ¾ø±â ¶§¹®ÀÌ´Ù.
ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ.
echo¼¹ö ÇÁ·Î±×·¥À» ¸ÕÀú ÇÑÂÊ Äֿܼ¡¼ ½ÇÇàÀ» ÇÏ°í ÀÌ ÇÁ·Î±×·¥À¸·Î ´Ù¸¥ Äֿܼ¡¼ ¿¬°á½ÃÄÑ º¸ÀÚ. ¿¬°áÀÌ Á¤»óÀûÀ¸·Î µÇ¾ú´Ù¸é, Ŭ¶óÀ̾ðÆ®¿¡¼ ¹®ÀÚ¸¦ Ä¡´Â ¼ø°£¸¶´Ù ¹®ÀÚ°¡ Àü¼ÛµÇ°í µÇµ¹·Á º¸³»Áú °ÍÀÌ´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ È¸é¿¡ ³ªÅ¸³ª´Â ¹®Àڴ Ŭ¶óÀ̾ðÆ®¿¡¼ Á÷Á¢ Âï´Â °ÍÀÌ ¾Æ´Ï¶ó ¼¹ö¿¡¼ µÇµ¹·Á º¸³»Áø ¹®ÀÚÀÌ´Ù.
ÀÌ»óÀ¸·Î ¼ÒÄÏ°ü·Ã ½Ã½ºÅÛ È£ÃâÀ» »ìÆ캸¸é¼, °£´ÜÇÏ°Ô ÀÌÇØ°¡ µÇ¾ú±æ ¹Ù¶õ´Ù. ´ÙÀ½Æí¿¡¼´Â °£´ÜÇÑ telnet client ÇÁ·Î±×·¥À» ¸¸µé¸é¼ ½ÇÁ¦ÀûÀÎ ¾îÇø®ÄÉÀÌ¼Ç ÀÛ¼ºÀ» Çغ»´Ù.
Àü¿µÁØ
Çѱ¹Ç×°ø´ëÇб³ ÄÄÇ»ÅÍ°øÇаú 96Çйø
ÇÏÀÌÅÚ: MonaC
email: monac@ee.korea.ac.kr
<³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀÇ ½ÃÀÛÀ» À§ÇÑ ¾È³»>
³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀº ±âº»ÀûÀÎ À¯´Ð½º ÇÁ·Î±×·¡¹Ö ÁÖÁ¦°¡ ¾Æ´Ï´Ù. À¯´Ð½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀÎ Áö½ÄÀÌ ¾øÀÌ´Â ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ» Á¦´ë·Î ¹è¿ö³ª°¡±â°¡ ¾î·Á¿ï °Í ÀÌ´Ù. ¼ö¸¹Àº ÆÄÀÏ ÄÜÆ®·Ñ ±â¹ýµéÀ» ´Ù·ç°Ô µÉ °ÍÀÌ°í, À¯´Ð½º ½Ã½ºÅÛÀÇ ³»ºÎÀûÀÎ µ¿ÀÛÀ» ±âº»Áö½ÄÀ¸·Î ÇÊ¿ä·Î ÇÒ °ÍÀÌ´Ù. ¾ÆÁ÷ À¯´Ð½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡ Àͼ÷Ä¡ ¾ÊÀº ºÐÀº À¯´Ð½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö °ü·Ã Àü¹® ¼ÀûÀ» Àϵ¶Çϱ⸦ ±ÇÇÑ´Ù.
Stevens¾¾°¡ ÁöÀº Unix Network ProgrammingÀ̶õ Ã¥Àº À¯´Ð½º ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀÇ ¹ÙÀ̺íÀ̶ó ÇÒ ¸¸ÇÑ Ã¥ÀÌ´Ù. Stevens¾¾´Â ÀÌ Ã¥ ¿Ü¿¡µµ Advanced Programming in the UNIX Environment¶ó´Â À¯¸íÇÑ Ã¥µµ Áö¾ú´Ù. ±×ÀÇ ÀÌ ³×Æ®¿÷ ¼ÀûÀº ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö¿¡ °ü·ÃµÈ °ÅÀÇ ¸ðµç °ÍÀÌ ¸Á¶óµÇ¾î ÀÖ¾î ÇʼöÀûÀ̶ó ÇÒ ¸¸ÇÑ Ã¥ÀÌÁö¸¸ Ãʺ¸ÀÚ°¡ È¥ÀÚ¼ Àб⿡´Â ´Ù¼Ò Èûµç Á¡ÀÌ ¸¹´Ù.
Àá½Ã ÀÌ Ã¥¿¡ °üÇÑ ¾È³»¸¦ ÇÏ°Ú´Ù.
ÀÌ Ã¥ÀÇ ¾ÕºÎºÐ¿¡´Â À¯´Ð½º ½Ã½ºÅÛ°ú ³×Æ®¿÷ÀÇ ±âº» Áö½ÄÀ¸·Î 250ÆäÀÌÁö¿¡ °ÉÃÄ ¸¹Àº ¼³¸íÀ» ÇØ ³õ¾Ò´Ù. ±×·¯³ª ÀÌ ¼³¸íÀº "À¯´Ð½º ½Ã½ºÅÛ¿¡ Àͼ÷Ä¡ ¾ÊÀº »ç¶÷¿¡°Õ ´Ù¸¥ ÁÁÀº Ã¥À» Àд °ÍÀÌ ´õ ³´°í, À¯´Ð½º ½Ã½ºÅÛ¿¡ Àͼ÷ÇÑ ÇÁ·Î±×·¡¸Ó´Â ÀÌ ºÎºÐÀÌ ÇÊ¿ä°¡ ¾ø±â" ¶§¹®¿¡ ÀúÀÚ°¡ Ã¥ÀÇ ¿Ï°á¼ºÀ» ³ôÀ̱â À§Çؼ ³ÖÀº ºÎºÐÀ̶ó°í »ý°¢ÇÏ¸é µÉ °ÍÀÌ´Ù. ´Ù¸¸ 4Àå°ú 5ÀåºÎºÐÀÇ ³×Æ®¿÷ ¹è°æÁö½Ä¿¡ ´ëÇؼ´Â °£´ÜÈ÷ ÈÈ¾î º¸´Â °Íµµ ÁÁÀ» °ÍÀÌ´Ù.
³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀÇ ÇÙ½ÉÀº 6Àå°ú 8Àå¿¡ ¸ðµÎ ´Ù ÀÖ´Ù. 6Àå°ú 8Àå¿¡ ÀÖ´Â ºÎºÐ¸¸ ¸ðµÎ ÀÌÇظ¦ ÇÏ°í ÀÖ´Ù¸é ÀϹÝÀûÀÎ ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö½Ã ÀüÇô ¾î·Á¿î Á¡ÀÌ ¾øÀ» °ÍÀÌ´Ù. À¯´Ð½º ½Ã½ºÅÛ°ú ³×Æ®¿÷¿¡ °üÇØ ±íÀº Áö½ÄÀ» ¾ò°íÀÚ ÇϽô ºÐÀº 14Àå ¶Ç´Â 15Àå¿¡ ÀÖ´Â ºÎºÐÀ» °øºÎÇÏ¸é »ó´çÇÑ µµ¿òÀÌ µÇ¸®¶ó »ý°¢µÈ´Ù.
(ÀÌ Ã¥ÀÇ ÇѱÛÆÇÀ» ÀÐÀ¸¸é ¿ë¾î¿¡ ´ëÇÑ ½É°¢ÇÑ È¥µ¿ÀÌ »ý±æ °ÍÀÌ´Ù. ¿µ¾î¿¡ ºÎ´ãÀÌ ¾øÀ¸½Å ºÐÀº ¿µ¾î·Î µÈ ¿ø¼¸¦ ±¸ÀÔÇϱæ ÃßõÇÑ´Ù.)
À¯´Ð½º ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ °ü·Ã Àǹ®»çÇ×ÀÌ »ý±â¸é ¿ì¼± socket FAQ¸¦ »ìÆ캸±â ¹Ù¶õ´Ù. ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» óÀ½ °øºÎÇϽô ºÐÀÌ °¡Áú ¼ö ÀÖ´Â ¸ðµç Áú¹®°ú ´äÀÌ ¿©±â¿¡ ÀûÇôÀÖ´Ù. ´ÙÀ½ÀÇ site¿¡¼ ±¸ÇÒ ¼ö ÀÖ´Ù.
|
Hit : 9786 Date : 2011/03/25 10:34
|