1581, 6/80 ȸ¿ø°¡ÀÔ  ·Î±×ÀΠ 
   ºÎ·¯ÁøºÐÇÊ
   http://minihp.cyworld.com/pims/main/pims_main.asp?tid=60039153
   ¸®´ª½º °­Á ¸®´ª½º/À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö

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 : 9146     Date : 2011/03/25 10:34



    
1481   Ä¿³Î ¾÷±×·¹ÀÌµå ¹æ¹ý[2]     ºó´ë
01/04 8657
1480   ÃÊ°£´Ü ¸®´ª½º ¸í·É¾î, ±âº»ÀûÀ¸·Î ²À²À ¾Ë¾Æ¾ß ÇÒ °Í[14]     ºó´ë
01/04 10274
1479   ¸®´ª½º °­Á µð½ºÅ©°ü¸®¸¦ À§ÇÑ Quota »ç¿ëÇϱ⠠   ºÎ·¯ÁøºÐÇÊ
03/25 7866
  ¸®´ª½º °­Á ¸®´ª½º/À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö     ºÎ·¯ÁøºÐÇÊ
03/25 9145
1477   ¸®´ª½º°­Á sparc ¸®´ª½º ¼³Ä¡     ºÎ·¯ÁøºÐÇÊ
03/25 8711
1476   ¸®´ª½º °­Á (·¹µåÇÞ ¸®´ª½º)[1]     ºÎ·¯ÁøºÐÇÊ
03/25 11198
1475   ¸®´ª½º °­Á (¸®´ª½º¶õ¹«¾ùÀΰ¡)     ºÎ·¯ÁøºÐÇÊ
03/25 8276
1474   µµ´ëü°¡.. ÀÌÇØ°¡ ¾È°¡´Â±º¿ä..[10]     ºÀÃá»ï
05/04 7305
1473   ¤» ÄÄÅÍ ºü¸£°Ô Çϴ¹æ¹ý?[1]     ¹«¼ÒÀ¯
12/17 9108
1472   ÀÌÁ¦¸·Ã³À½½ÃÀÛÇÑ Ãʺ¸ÀÔ´Ï´Ù[3]     ¹Ì½ºÅ͸®
02/02 8021
1471   ÆíÁý¾øÀ½ v5 À¯´Ð½º¸í·É¾î file system[4]     ¹Ì¹Ì123
06/01 8035
1470   ÆíÁý¾øÀ½ v4 À¯´Ð½º ¸í·É¾î     ¹Ì¹Ì123
06/01 8108
1469   ÆíÁý¾øÀ½ v3 À¯´Ð½ºÆ¯Â¡[1]     ¹Ì¹Ì123
06/01 8871
1468   À¯´Ð½º v2 ÆíÁý¾øÀ½~[1]     ¹Ì¹Ì123
06/01 7958
1467   À¯´Ð½º v1 ÆíÁý¾øÀ½...ÆíÁýÇؼ­º¸¼¼¿ä~~[1]     ¹Ì¹Ì123
06/01 7452
1466   1[1]     ¹é¹ÎÁØõÀç
08/31 4781
1465   2[1]     ¹é¹ÎÁØõÀç
08/31 4776
1464   c¾ð¾î[1]     ¹é¹ÎÁØõÀç
08/31 4856
1463   c¾ð¾î[1]     ¹é¹ÎÁØõÀç
08/31 4845
1462   ¿Ø¸¸ÇÑ»ç¶÷µéÀº´Ù¾ËÁöµµ¸ð¸£°ÚÁö¸¸[6]     ¹é·æÃâÇØ
03/17 12314
[1][2][3][4][5] 6 [7][8][9][10]..[80]

Copyright 1999-2024 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org