¸®´ª½º/À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö1
-¿¬°á ÁöÇâ ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö-

    Á¤¿µÁØ/ÀÚÀ¯±â°í°¡

     

     

    ¹Ù¾ßÈå·Î ÀÎÅͳÝ/Åë½ÅÀ» ¸ð¸£¸é ÄĸÍÀ̶ó´Â ¼Ò¸± µè´Â ½Ã´ë°¡ ¿Ô´Ù. ÄÄÇ»ÅÍÀÇ ÁÖ¿ä ±â´É ¶ÇÇÑ ³×Æ®¿÷À¸·Î µÇ¾î °¡°í ÀÖ´Ù. ³×Æ®¿÷ÀÌ °­Á¡ÀÎ À¯´Ð½º/¸®´ª½º°¡ ±â½ÂÀ» ºÎ¸± ¶§ÀÌ´Ù. À¯´Ð½ºÀÇ ²ÉÀ̶ó ÇÒ ¼ö ÀÖ´Â ³×Æ®¿÷ ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇÔÀ¸·Î½á ÁøÁ¤ÇÑ À¯´Ð½º ÇÁ·Î±×·¡¸Ó°¡ µÇ¾î º¸ÀÚ.

 

Connection-oriented socket À̶õ?

    À¯´Ð½ºÀÇ ¸ðµç °ÍÀº ÆÄÀÏÀ̶ó´Â ¸»ÀÌ ÀÖ´Ù. ÀÌ ¸»Àº  À¯´Ð½º ÇÁ·Î±×·¡¹ÖÀ» ÇØ º¸¸é ¸ðµç I/OÀÛ¾÷ÀÌ ÆÄÀÏ¿¡ ¾²°í ÀÐÀ½À¸·Î½á ÀÌ·ç¾î Áø´Ù´Â ¸»ÀÌ´Ù. ³×Æ®¿÷ÀÇ ÀÛµ¿ ¶ÇÇÑ ¸¶Âù°¡ÁöÀÌ´Ù. ¾çÂÊÀÇ ÄÄÇ»ÅÍ°¡ °¢°¢ ÆÄÀÏ, Áï socket À» ¿­¾î¼­ ±× ÆÄÀÏÀ» ¿¬°á½ÃÄÑ Åë½ÅÀÌ ÀÌ·ç¾îÁö´Â °ÍÀÌ´Ù.
    ÁÖ·Î ¾²ÀÌ´Â socketÀÇ Å¸ÀÔÀº 2Á¾·ùÀÌ´Ù. Çϳª´Â stream socket ÀÌ°í ´Ù¸¥ Çϳª´Â datagram socket ÀÌ´Ù.

    Stream socketÀº ¾ÈÁ¤ÀûÀÎ ¾ç¹æÇâÀÇ ¿¬°áÀ» ¸¸µé ¶§ ÇÊ¿äÇÑ ¼ÒÄÏÀÌ´Ù. ÀÌ ¿¬°áÀº ¾ç¹æÇâÀ¸·Î Åë½ÅÀÌ °¡´ÉÇϸç, µ¥ÀÌÅ͵éÀÇ ¼ø¼­°¡ Á¤È®ÇÏ´Ù. ¶ÇÇÑ ÀÌ ¿¬°áÀº tcp ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇϹǷΠ¿¡·¯ üŷÀÌ µÇ¾î ¾ÈÁ¤ÀûÀÎ µ¥ÀÌÅÍ Àü¼ÛÀÌ °¡´ÉÇÏ´Ù. telnet À̳ª http.ftp µî°ú °°ÀÌ »óÈ£ ÀÛ¿ëÀÌ ÇÊ¿äÇÏ°í ¾ÈÁ¤ÀûÀÎ ¿¬°áÀÌ ¿ä±¸µÉ ¶§ ¹Ù·Î ÀÌ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù. ÀÌ ¼ÒÄÏÀ» ´Ù¸¥ ¸»·Î connection-oriented socket À̶ó°íµµ ÇÑ´Ù.

    ¹Ý¸é 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¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.

    ftp://rtfm.mit.edu/pub/usenet/news.answers/unix-faq/socket
    http://www.auroraonline.com/sock-faq
    http://kipper.york.ac.uk/~vic/sock-faq




¡ã top

homeÀ¸·Î...