¼ÒÄÏ ÇÁ·Î±×·¥ÀÌ ¾î·Æ³ª¿ä? ±×³É ¸ÇÆäÀÌÁö¸¸ º¸°í¼´Â ¾Ë¾Æ³»±â°¡ Á» ¾î·´³ª¿ä? ¹º°¡ À־ÀÌ´Â ÀÎÅÍ³Ý ÇÁ·Î±×·¥À» ¸¸µé°í ½ÍÁö¸¸ bind()¸¦ È£ÃâÇÏ°í connect()¸¦ È£ÃâÇÏ°í ÀÌ·± Àú·± ±¸Á¶Ã¼¸¦ µÚÁö°í ÇÒ ½Ã°£ÀÌ ¾ø³ª¿ä?
±Û½ê¿ä, Á¦°¡ ±× Áö°Ü¿î°É ´Ù Çسõ¾Ò°í¿ä, ¿©·¯ºÐ°ú ÀÌ Á¤º¸¸¦ °øÀ¯ÇÏ°í ½Í±º¿ä. ¹Ù·Î ã¾Æ¿À¼Ì½À´Ï´Ù. ÀÌ ¹®¼°¡ ¹Ù·Î Æò±ÕÀûÀÎ C ÇÁ·Î±×·¡¸Ó¿¡°Ô ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡ °ü·ÃµÈ Á¤º¸¸¦ µå¸±°Ì´Ï´Ù.
ÀÌ ¹®¼´Â ¾È³»¼ÀÌÁö ¸®ÆÛ·±½º´Â ¾Æ´Õ´Ï´Ù. ¾Æ¸¶µµ ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» óÀ½ ½ÃÀÛÇÏ¸é¼ ¾îµð¼ºÎÅÍ ÇØ¾ß ÇÒÁö ¸ð¸£´Â »ç¶÷µé¿¡°Ô µµ¿òÀÌ µÉ°Ì´Ï´Ù. ¹°·Ð ¾î¶² Àǹ̿¡¼µµ ÀÌ ±ÛÀº ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ¿Ïº®ÇÑ ¾È³»¼´Â ¾Æ´Ò °Ì´Ï´Ù. ´ÜÁö µµÀúÈ÷ Àǹ̸¦ ¾Ë ¼ö ¾ø´ø ¸ÇÆäÀÌÁöµéÀ» Á¶±Ý¾¿ ÀÌÇØÇÏ°Ô µÇ±â¸¸ ¹Ù¶ö »ÓÀÔ´Ï´Ù.
´ëºÎºÐÀÇ ÄÚµå´Â ¸®´ª½º PC¿¡¼ GNUÀÇ gcc¸¦ ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏ µÇ¾ú½À´Ï´Ù. ¶ÇÇÑ HPUX¿¡¼ gcc¸¦ ÀÌ¿ëÇؼ ÄÄÆÄÀÏ µÈ´Ù´Â °Íµµ È®ÀÎÇß½À´Ï´Ù. ±×·¯³ª ¸ðµç ÀÛÀº ÄÚµåµéÀÌ Å×½ºÆ® µÈ°ÍÀº ¾Æ´Ï¶ó´Â °ÍÀ» ±â¾ïÇϽñ⠹ٶø´Ï´Ù.
(ÀÌÇÏ Á¸Äª »ý·«)
¼ÒÄÏÀ̶õ ´Ü¾î´Â ¸¹ÀÌ µé¾úÀ» °ÍÀÌ´Ù. ±×¸®°í ¾Æ¸¶µµ ±× ¼ÒÄÏÀÌ Á¤È®È÷ ¹«¾ùÀΰ¡¿¡ ´ëÇÏ¿© ±Ã±ÝÇØ Çϱ⵵ ÇßÀ» °ÍÀÌ´Ù. ¼ÒÄÏÀº Á¤±Ô À¯´Ð½º ÆÄÀÏ ±â¼úÀÚ¸¦ ÀÌ¿ëÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥°ú Á¤º¸¸¦ ±³È¯ÇÏ´Â ¹æ¹ýÀ» ÀǹÌÇÑ´Ù.
¹¹¶ó°í¶ó?
ÁÁ´Ù. ¾Æ¸¶µµ À¯´Ð½º¸¦ ÀßÇÏ´Â »ç¶÷µéÀÌ ÀÌ·¸°Ô ¾ê±âÇÏ´Â °ÍÀ» µé¾îº» ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. "À¯´Ð½º¿¡¼´Â ¸ðµç°Ô ÆÄÀÏ·Î µÇ¾îÀÖ±º!" ½ÇÁ¦·Î ±×µéÀÌ ¾ê±âÇÏ´Â °ÍÀº ¸ðµç À¯´Ð½º ÇÁ·Î±×·¥µéÀÌ ¾î¶² Á¾·ùÀÇ ÀÔÃâ·ÂÀ» ÇÏ´õ¶óµµ ÆÄÀÏ ±â¼úÀÚ¸¦ ÅëÇؼ ÇÏ°Ô µÈ´Ù´Â °ÍÀÌ´Ù. ÆÄÀÏ ±â¼úÀÚ´Â »ç½Ç ¿·ÁÁø ÆÄÀÏÀ» ÀǹÌÇÏ´Â Á¤¼öÀÏ »ÓÀÌ´Ù. ±×·¯³ª ±× ÆÄÀÏÀº ³×Æ®¿öÅ©°¡ µÉ¼öµµ ÀÖ°í FIFO, ÆÄÀÌÇÁ, Å͹̳Î, ½ÇÁ¦ µð½ºÅ©»óÀÇ ÆÄÀÏÀÌ µÉ¼öµµ ÀÖÀ¸¸ç ±× ¹ÛÀÇ ¹«¾ùµµ ´Ù µÈ´Ù´Â °ÍÀÌ´Ù. À¯´Ð½ºÀÇ ¸ðµç°ÍÀº ÆÄÀÏÀÌ´Ù! µû¶ó¼ ´ç½ÅÀÌ ÀÎÅͳÝÀ» ÅëÇÏ¿© ¸Ö¸® ¶³¾îÁø ´Ù¸¥ ÇÁ·Î±×·¥°ú Á¤º¸¸¦ ±³È¯Çϱâ À§Çؼ´Â ÆÄÀÏ ±â¼úÀÚ¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù´Â °ÍÀÌ´Ù. ¹ÏÀ¸¼î~
"¶È¶ÈÀÌ ¾ç¹Ý, ±× ÆÄÀÏ ±â¼úÀÚ´Â µµ´ëü ¾î¶»°Ô ¸¸µå´Â°Å¿ä?" ¶ó´Â°Ô ´ç½ÅÀÇ ¸¾¼Ó¿¡ Áö±Ý ¸· ¶°¿À¸¥ Áú¹®ÀÏ °ÍÀÌ´Ù. ¿©±â¿¡ ´ë´äÀÌ ÀÖ´Ù. socket()À» È£ÃâÇÏ¸é ¼ÒÄÏ ±â¼úÀÚ¸¦ ¾ò°Ô µÇ°í send(), recv()µîÀÇ ¼ÒÄÏ¿¡ °ü·ÃµÈ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Á¤º¸¸¦ ±³È¯ÇÒ ¼ö ÀÖ´Ù. (man send, man recv¸¦ ÇغÁµµ µÊ)
"Àá±ñ!" ÀÌ·¸°Ô ÀÌÀǸ¦ Á¦±âÇÏ°ÚÁö. "±× ¼ÒÄÏ ±â¼úÀÚ°¡ ÆÄÀÏ ±â¼úÀÚ¶ó¸é µµ´ëü ¿Ö read(),write()¸¦ ¾²¸é ¾ÈµÇ´Â°Å¿ä?" ª°Ô ¸»ÇÏ¸é ¸Â´Ù. ±×·¯³ª send(),recv()¸¦ ¾²´Â °ÍÀÌ ¿©·¯¸ð·Î ³×Æ®¿öÅ©¸¦ ÅëÇÑ Á¤º¸Àü´ÞÀ» Á¦¾îÇϱ⿡ µµ¿òÀÌ µÈ´Ù´Â °ÍÀÌ´Ù.
´ÙÀ½Àº ¹º°¡? ¼ÒÄÏÀÇ Á¾·ù´Â? DARPA ÀÎÅÍ³Ý ÁÖ¼Ò(ÀÎÅÍ³Ý ¼ÒÄÏ), °æ·Î¸í°ú Áö¿ª³ëµå(À¯´Ð½º ¼ÒÄÏ), CCITT X.25 ÁÖ¼Ò(X.25 ¼ÒÄÏ, ±×³É ¹«½ÃÇصµ µÊ)µîÀÌ ÀÖ°í ¾Æ¸¶µµ ´ç½ÅÀÌ ¾²´Â À¯´Ð½º¿¡ µû¶ó¼ ´õ ¸¹Àº Á¾·ùÀÇ ¼ÒÄϵéÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¹®¼´Â ù¹ø° (ÀÎÅÍ³Ý ¼ÒÄÏ) Çϳª¸¸ ¼³¸íÇÒ °ÍÀÌ´Ù.
ÀÎÅÍ³Ý ¼ÒÄÏ¿¡ µÎ°¡Áö Á¾·ù°¡ ÀÖ³ª? ±×·¸´Ù. À½..»ç½ÇÀº °ÅÁþ¸»ÀÌ´Ù. Á» ´õÀÖ±ä ÇÏÁö¸¸ °ÌÀ» ÁÖ°í ½ÍÁö ¾Ê±â ¶§¹®¿¡ ÀÌ°Í µÎ°¡Áö¸¸ À̾߱â ÇÏ´Â °ÍÀÌ´Ù. RAW ¼ÒÄÏÀ̶ó´Â ¸Å¿ì °·ÂÇÑ °Íµµ ÀÖÀ¸¸ç Çѹø ºÁµÎ´Â °Íµµ ÁÁ´Ù.
µÎ°¡Áö Á¾·ù´Â ¹«¾ùÀΰ¡? Çϳª´Â ½ºÆ®¸²¼ÒÄÏ ÀÌ°í ´Ù¸¥ Çϳª´Â µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀÌ´Ù. ÀÌÈÄ¿¡´Â SOCK_STREAM, SOCK_DGRAMÀ¸·Î ÁöĪµÉ °ÍÀÌ´Ù. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ºñ¿¬°á ¼ÒÄÏÀ̶ó°íµµ ÇÑ´Ù. (ºñ·Ï ±× ¼ÒÄÏ¿¡¼µµ ¿øÇÑ´Ù¸é connect()¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. connect()ÀýÀ» ÂüÁ¶ÇÒ°Í)
½ºÆ®¸² ¼ÒÄÏÀº ¾çÃøÀ» ½Å·Ú¼ºÀÖ°Ô ¿¬°áÇØ ÁÖ´Â ¼ÒÄÏÀÌ´Ù. ¸¸¾à µÎ°¡Áö ¾ÆÀÌÅÛÀ» ÀÌ ¼ÒÄÏÀ» ÅëÇÏ¿© º¸³½´Ù¸é ±× ¼ø¼´Â Á¤È®È÷ À¯ÁöµÉ °ÍÀÌ´Ù. ¿¡·¯±îÁö ±³Á¤µÈ´Ù. ¸¸ÀÏ ¿¡·¯°¡ »ý±ä´Ù¸é ´ç½Å ½Ç¼öÀÌ°í ´ç½Å½Ç¼ö¸¦ ¸·´Â ¹æ¹ýÀº ¿©±â¼ ¼³¸íÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
½ºÆ®¸² ¼ÒÄÏÀº ¾îµð¿¡ ¾²À̴°¡? ¾Æ¸¶µµ ÅÚ³ÝÀ̶ó°í µé¾îºÃÀ» °ÍÀÌ´Ù. µé¾îºÃ´À´¢? ±×°Ô ÀÌ ¼ÒÄÏÀ» ¾´´Ù. ÀÔ·ÂÇÑ ¸ðµç ±ÛÀÚ´Â ±× ¼ø¼´ë·Î Àü´ÞÀÌ µÇ¾ß ÇÏ´Â °æ¿ìÀÌ´Ù. »ç½Ç WWW»çÀÌÆ®ÀÇ Æ÷Æ® 80¿¡ ÅÚ³ÝÀ¸·Î Á¢¼ÓÇÏ¿© "GET pagename" À» ÀÔ·ÂÇϸé HTML ÈÀÏÀÇ ³»¿ëÀÌ ¿ì¸£¸£ ³ª¿Ã °ÍÀÌ´Ù.
¾î¶»°Ô ½ºÆ®¸² ¼ÒÄÏÀÌ ÀÌÁ¤µµÀÇ Á¤È®ÇÑ Àü¼Û Ç°ÁúÀ» °®Ãß°Ô µÇ´Â°¡? ÀÌ ¼ÒÄÏÀº TCP¸¦ ÀÌ¿ëÇϱ⠶§¹®ÀÌ´Ù. (Transmission Control Protocol, RFC-793¿¡ ¹«Ã´ ÀÚ¼¼ÇÏ°Ô ³ª¿ÍÀÖ´Ù.) ¾Æ¸¶µµ TCP º¸´Ù´Â TCP/IP¸¦ ´õ ¸¹ÀÌ µé¾îºÃÀ» °ÍÀÌ´Ù. ¾ÕºÎºÐÀº ¹Ù·Î ÀÌ TCPÀÌ°í µÞºÎºÐÀÇ IP´Â ÀÎÅÍ³Ý ¶ó¿ìÆÃÀ» ´ã´çÇÏ´Â ÇÁ·ÎÅäÄÝÀÌ´Ù.
±¦Âú±º~ µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ¾î¶²°¡? ¿Ö ºñ¿¬°áÀ̶ó°í ÇÏ´ÂÁö? ³»¿ë¿¡ ¹«½¼ °ü·ÃÀÌ ÀÖ´ÂÁö? ¿Ö ½Å·Úµµ°¡ ¶³¾îÁöÁö? »ç½Ç ÀÌ ¼ÒÄÏÀÇ °æ¿ì ´ç½ÅÀÌ µ¥ÀÌÅͱ׷¥À» º¸³½´Ù¸é Á¤È®È÷ µµÂøÇÒ ¼öµµ ÀÖ´Ù. ¶Ç´Â ÆÐŶµéÀÇ ¼ø¼°¡ ¹Ù²î¾î¼ µµÂøÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ¸¸¾à µµÂøÇÑ´Ù¸é ±× ³»¿ëÀº »ç½Ç Á¤È®ÇÑ °ÍÀÌ´Ù.
µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ ¶ÇÇÑ ¶ó¿ìÆÿ¡´Â IP¸¦ ÀÌ¿ëÇÏÁö¸¸ TCP´Â ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù. »ç½ÇÀº UDP(RFC-768)À» ÀÌ¿ëÇÑ´Ù.
¿¬°áÀ» ¾ÈÇϴ°¡? ½ºÆ®¸² ¼ÒÄÏ¿¡¼Ã³·³ ¿·ÁÀÖ´Â ¿¬°áÀ» °ü¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Â °ÍÀÌ´Ù. ±×³É µ¥ÀÌÅÍ ÆÐŶÀ» ¸¸µé¾î¼ ¸ñÀûÁö¿¡ °ü·ÃµÈ IPÇì´õ¸¦ ºÙ¿©¼ ¹ß¼ÛÇϱ⸸ ÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ¿¬°áÀÌ ÇÊ¿ä¾ø´Ù. º¸Åë tftp³ª bootp ¿¡ »ç¿ëµÇ´Â °ÍÀÌ´Ù.
ÁÁ¾Æ! ±×·¯¸é µ¥ÀÌÅÍ ÆÐŶÀÌ µµÂøÇÏÁö ¾ÊÀ»Áöµµ ¸ð¸£´Â ÀÌ·± °É ¾î¶»°Ô ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÏÁö? »ç½Ç ÇÁ·Î±×·¥µéÀº UDPÀ§¿¡ ±× ³ª¸§´ë·ÎÀÇ ´ëÃ¥À» °®Ãß°í ÀÖ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¸é tftp°°Àº °æ¿ì¿¡´Â ÇϳªÀÇ ÆÐŶÀ» º¸³½ ÈÄ¿¡ »ó´ëÆíÀÌ Àß ¹Þ¾Ò´Ù´Â ÀÀ´ä ÆÐŶÀÌ ¿Ã¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ´Ù. ¸¸¾à ÀÏÁ¤½Ã°£(¿¹¸¦ µé¸é 5ÃÊ)µ¿¾È ÀÀ´äÀÌ ¾øÀ¸¸é ¸ø¹ÞÀº °ÍÀ¸·Î °£ÁÖÇÏ°í ´Ù½Ã º¸³»°í, ´Ù½Ã º¸³»°í ÀÀ´äÀÌ ÀÖÀ¸¸é ´ÙÀ½ ÆÐŶÀ» º¸³»°í ÇÏ°Ô µÇ´Â°ÍÀÌ´Ù. ÀÌ Àß¹Þ¾Ò´Ù´Â ÀÀ´ä(ACK reply) ¹æ½ÄÀº »ç½Ç SOCK_DGRAMÀ» »ç¿ëÇÒ °æ¿ì ¸Å¿ì Áß¿äÇÏ´Ù.
°£´ÜÈ÷ ÇÁ·ÎÅäÄÝÀÇ ·¹À̾ ´ëÇؼ ¾ð±ÞÀ» ÇßÁö¸¸(UDPÀ§¿¡ ³ª¸§´ë·ÎÀÇ ´ëÃ¥ ¾î¼±¸) ÀÌÁ¦´Â ½ÇÁ¦·Î ³×Æ®¿öÅ©°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´Â Áö¸¦ ¾Ë¾Æº¼ ¶§°¡ µÇ¾ú°í ½ÇÁ¦·Î SOCK_DGRAMÀÌ ¾î¶»°Ô ±¸¼ºµÇ´Â Áö¸¦ ¾Ë¾Æº¼ ÇÊ¿ä°¡ ÀÖÀ» °Í°°´Ù. »ç½Ç ÀÌ ÀýÀº ±×³É ³Ñ¾î°¡µµ µÈ´Ù.
¿©·¯ºÐ~ ÀÌÁ¦´Â µ¥ÀÌŸ ĸ½¶È¿¡ ´ëÇÏ¿© ¹è¿ì°Ú¾î¿ä~ »ç½Ç ÀÌ°ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù. ¾ó¸¶³ª Áß¿äÇÏ³Ä¸é ¿ì¸® Çб³¿¡¼ ³×Æ®¿öÅ© ÄÚ½º¸¦ Åë°úÇÏ·Á¸é ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÏ´Â »çÇ×À̱⠶§¹®ÀÌ´Ù. (Èì..) ³»¿ëÀº ÀÌ·¸´Ù. µ¥ÀÌÅÍ ÆÐŶÀÌ ¸¸µé¾îÁö¸é ¸ÕÀú ù¹ø° ÇÁ·ÎÅäÄÝ(tftp ÇÁ·ÎÅäÄÝ)¿¡ ÇÊ¿äÇÑ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ºÙ´Â´Ù. ÀÌ·¸°Ô Çѹø ĸ½¶ÈµÈ ³»¿ëÀº ´Ù½Ã µÎ¹ø° ÇÁ·ÎÅäÄÝ(UDP)¿¡ °ü·ÃµÈ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ´Ù½Ã ºÙ°Ô µÈ´Ù. ±× ´ÙÀ½¿¡´Â IP, ±× ´ÙÀ½¿¡´Â ¸¶Áö¸·À¸·Î Çϵå¿þ¾î ÀûÀÎ °èÃþÀ¸·Î¼ ÀÌ´õ³Ý ÇÁ·ÎÅäÄݷΠĸ½¶È°¡ µÇ´Â °ÍÀÌ´Ù.
´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ÀÌ ÆÐŶÀ» ¹Þ°Ô µÇ¸é Çϵå¿þ¾î°¡ ÀÌ´õ³Ý Çì´õ¸¦ Ç®°í Ä¿³Î¿¡¼ IP¿Í UDP Çì´õ¸¦ Ç®°í tftp ÇÁ·Î±×·¥¿¡¼ tftpÇì´õ¸¦ Ç®°í ÇÏ¿© ³¡À¸·Î ¿ø·¡ÀÇ µ¥ÀÌÅ͸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù.
ÀÌÁ¦ µåµð¾î ¾Ç¸í³ôÀº °èÃþÀû ³×Æ®¿öÅ© ¸ðµ¨(Layered Network Model)À» ¾ê±âÇÒ ¶§°¡ µÈ°Í °°´Ù. ÀÌ ¸ðµ¨Àº ´Ù¸¥ ¸ðµ¨µé¿¡ ºñÇؼ ³×Æ®¿öÅ©ÀÇ ½Ã½ºÅÛÀ» ±â¼úÇÏ´Â Ãø¸é¿¡¼ ¸¹Àº ÀÌÁ¡ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¸é ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ì ´õ ³·Àº °èÃþ¿¡¼ ¾î¶² ¹°¸®ÀûÀÎ ¹æ½Ä(½Ã¸®¾óÀÎÁö thin ethernetÀÎÁö ¶Ç´Â AUI¹æ½ÄÀÎÁö)À¸·Î Àü´ÞµÇ´Â Áö¿¡ ´ëÇÏ¿© ÀüÇô ½Å°æÀ» ¾²Áö ¾Ê°íµµ ÀÛ¾÷ÀÌ °¡´ÉÇØ Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ½ÇÁ¦ ³×Æ®¿öÅ© Àåºñ³ª ÅäÆú·ÎÁö´Â ¼ÒÄÏ ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ÀüÇô °ü°è¾ø´Â ºÐ¾ßÀÌ´Ù.
´õÀÌ»ó ¶°µéÁö ¾Ê°í ´ÙÀ½ °èÃþµéÀ» ÀÏ·¯ Áִµ¥ ¸¸ÀÏ ³×Æ®¿öÅ© ÄÚ½º¿¡¼ ½ÃÇèÀ» º¸°Ô µÉ °æ¿ì¶ó¸é ¿Ü¿ì´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.
¹°¸®Àû °èÃþ(Physical layer)´Â Çϵå¿þ¾î(½Ã¸®¾ó, ÀÌ´õ³Ýµî) ÀÌ´Ù. ¾îÇø®ÄÉÀÌ¼Ç °èÃþÀº »ó»óÇÒ ¼ö ÀÖµíÀÌ ¹°¸®Àû °èÃþÀÇ ¹Ý´ëÆí ³¡ÀÌ´Ù. ÀÌ °èÃþÀ» ÅëÇÏ¿© »ç¿ëÀÚ´Â ³×Æ®¿öÅ©¿Í Á¢ÃËÇÏ°Ô µÇ´Â °ÍÀÌ´Ù.
»ç½Ç ÀÌ ¸ðµ¨Àº ÀÚµ¿Â÷ ¼ö¸® ¼³¸í¼ ó·³ ½ÇÁúÀûÀÎ ¹º°¡¸¦ ÇÒ ¼ö Àֱ⿡´Â ³Ê¹«³ª ÀϹÝÀûÀÎ ¾ê±âÀÌ´Ù. À¯´Ð½ºÀÇ °æ¿ì¸¦ µé¾î º¸´Ù ½ÇÁúÀûÀÎ ¾ê±â¸¦ ÇØ º»´Ù¸é,
ÀÌ·¯ÇÑ °èÃþÀ¸·Î »ìÆì º»´Ù¸é ¾Æ±îÀÇ µ¥ÀÌÅÍ Ä¸½¶È°¡ °¢°¢ ¾î¶² °èÃþ¿¡ ¼ÓÇÏ´Â °¡¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·¸°Ô ¸¹Àº ÀÛ¾÷ÀÌ ÇϳªÀÇ µ¥ÀÌÅÍ ÆÐŶÀ» ¸¸µå´Âµ¥ µ¿¿øµÇ´Â °ÍÀÌ´Ù. ÀÌ ³»¿ëÀ» ´ç½ÅÀÌ µ¥ÀÌÅÍÀÇ ÆÐŶ ¸Ó¸®ºÎºÐ¿¡ ¸ù¶¥ ŸÀÌÇÎ ÇØ ³Ö¾î¾ß ÇÑ´Ù´Â ¾ê±â´Ù. (¹°·Ð ³ó´ãÀÌ´Ù.) ½ºÆ®¸² ¼ÒÄÏÀÇ °æ¿ì µ¥ÀÌÅ͸¦ ³»º¸³»±â À§ÇØ ÇØ¾ß ÇÒ ÀÏÀº ¿ÀÁ÷ send()¸¦ È£ÃâÇÏ´Â °Í »ÓÀÌ´Ù. µ¥ÀÌÅÍ ±×·¥ÀÇ °æ¿ì¿¡´Â ¿øÇÏ´Â ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ Çѹø ĸ½¶ÈÇÏ°í (tftp¹æ½Äµî) sendto()·Î º¸³»¹ö¸®¸é µÇ´Â °ÍÀÌ´Ù.Ä¿³ÎÀÌ Àü¼Û°èÃþ°ú ÀÎÅÍ³Ý °èÃþ¿¡ °ü·ÃµÈ ĸ½¶È¸¦ ÇÏ°í ³ª¸ÓÁö´Â Çϵå¿þ¾î°¡ ÇÑ´Ù. ¾Æ~ ÷´Ü ±â¼ú!!
ÀÌ°ÍÀ¸·Î °£´ÜÇÑ ³×Æ®¿öÅ© ÀÌ·ÐÀº ³¡ÀÌ´Ù. Âü, ¶ó¿ìÆÿ¡ °üÇؼ ÇÏ°í ½Í´ø ¾ê±âµéÀ» Çϳªµµ ¾ÈÇß´Ù. Èì, Çϳªµµ ¾ø´Ù. Á¤¸»ÀÌÁö ¶ó¿ìÆÿ¡ °üÇؼ Çϳªµµ ¾ê±âÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¶ó¿ìÅÍ°¡ IPÇì´õ¸¦ ¹þ°Ü³»¼ ¶ó¿ìÆà Å×À̺íÀ» ÂüÁ¶ÇÏ¿© ¾î¼±¸ Àú¼±¸...¸¸ÀÏ Á¤¸»·Î ¿©±â¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é IP RFC¸¦ ÂüÁ¶ÇÒ °ÍÀÌ¸ç ¸¸¾à °Å±â¿¡ ´ëÇؼ Çϳªµµ ¾ËÁö ¸øÇÑ´Ù¸é! »ý¸í¿¡ ÁöÀåÀº ¾ø´Ù.
°á±¹Àº ¿©±â±îÁö ¿Ô±º. µåµð¾î ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ¾ê±â¸¦ ÇÒ ¶§ÀÌ´Ù. ÀÌ Àý¿¡¼´Â ½ÇÁ¦·Î ²Ï³ª ÀÌÇØÇϱ⠾î·Á¿î ¼ÒÄÏ ÀÎÅÍÆäÀ̽º¿¡¼ ¾²ÀÌ´Â ¿©·¯°¡Áö µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇÑ ¾ê±â¸¦ ÇÒ ¿¹Á¤ÀÌ´Ù.
¸ÕÀú ½¬¿î°Í. ¼ÒÄÏ ±â¼úÀÚÀÌ´Ù.¼ÒÄÏ ±â¼úÀÚÀÇ µ¥ÀÌÅÍ ÇüÀº
int
ÀÌ´Ù. ±×³É º¸Åë intÀÌ´Ù. (Á¤¼öÇü)
¹º°¡ Á» ÀÌ»óÇÏ´õ¶óµµ ±×³É Âü°í Àб⠹ٶõ´Ù. ÀÌ°ÍÀº ¾Ë¾Æ¾ß ÇÑ´Ù. Á¤¼ö¿¡´Â µÎ ¹ÙÀÌÆ®°¡ Àִµ¥ »óÀ§ ¹ÙÀÌÆ®°¡ ¾Õ¿¡ Àְųª ¶Ç´Â ÇÏÀ§ ¹ÙÀÌÆ®°¡ ¾Õ¿¡ ÀÖ°Ô µÈ´Ù. ¾ÕÀÇ °æ¿ì°¡ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼ÀÌ´Ù. ¾î¶² È£½ºÆ®´Â ³»ºÎÀûÀ¸·Î ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î Á¤¼ö¸¦ ÀúÀåÇÏ´Â °æ¿ìµµ ÀÖÀ¸³ª ¾È±×·± °æ¿ì°¡ ¸¹´Ù. ¸¸ÀÏ NBO¶ó°í ¾ð±ÞµÈ Á¤¼ö°¡ ÀÖ´Ù¸é ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© (htons()ÇÔ¼ö) È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¸¸¾à ±×·± ¾ð±ÞÀÌ ¾ø´Ù¸é ±×³É ³»¹ö·Á µÖµµ µÈ´Ù.
ù¹ø° ±¸Á¶Ã¼, struct sockaddr. ÀÌ ±¸Á¶Ã¼´Â ¿©·¯°¡Áö ÇüÅÂÀÇ ¼ÒÄÏ ÁÖ¼Ò¸¦ ´ã°ÔµÈ´Ù.
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ };
sa_family ´Â ¿©·¯°¡Áö°¡ µÉ ¼ö Àִµ¥, ÀÌ ¹®¼¿¡¼´Â ±×Áß¿¡¼ "AF_INET"ÀÎ °æ¿ì¸¸ ´Ù·ç°Ô µÈ´Ù. sa_data ´Â ¸ñÀûÁöÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£¸¦ °¡Áö°Ô µÈ´Ù. ¾à°£ ºñ½Ç¿ëÀûÀ̱º.
sockaddr ±¸Á¶Ã¼¸¦ ´Ù·ç±â À§Çؼ´Â ´ÙÀ½°ú °°Àº parallel structure¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ("in"Àº ÀÎÅͳÝÀ» ÀǹÌÇÑ´Ù.)
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 */ };
ÀÌ ±¸Á¶Ã¼´Â °¢°¢ÀÇ Ç×À» ÂüÁ¶ÇϱⰡ Á»´õ ½¬¿î °Í °°´Ù. ÁÖÀÇÇÒ Á¡Àº sin_zero¹è¿Àº sockaddr °ú ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ¸ÂÃß±â À§Çؼ ³Ö¾îÁø °ÍÀ̹ǷΠbzero()³ª memset()ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¸ðµÎ 0À¸·Î ä¿öÁ®¾ß ÇÑ´Ù. ¶ÇÇÑ ²Ï Áß¿äÇÑ Á¡Àε¥, ÀÌ ±¸Á¶Ã¼´Â sockaddr ÀÇ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÏ¿© ÂüÁ¶µÉ ¼ö ÀÖ°í ±× ¹Ý´ëµµ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼ socket()ÇÔ¼ö°¡ struct sockaddr * ¸¦ ¿øÇÏ´õ¶óµµ struct sockaddr_inÀ» »ç¿ëÇÒ ¼ö ÀÖ°í ¹Ù·Î ÂüÁ¶ÇÒ ¼öµµ ÀÖ´Â °ÍÀÌ´Ù. ¶ÇÇÑ sin_family´Â sa_family¿¡ ´ëÀÀµÇ´Â °ÍÀÌ¸ç ¹°·Ð "AF_INET"·Î ÁöÁ¤µÇ¾î¾ß Çϸç sin_port, sin_addrÀº ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î µÇ¾î¾ß ÇÏ´Â Á¡ÀÌ Áß¿äÇÑ °ÍÀÌ´Ù.
±×·¯³ª! ¾î¶»°Ô struct in_addr sin_addr Àüü°¡ NBO°¡ µÉ ¼ö Àִ°¡? ÀÌ Áú¹®Àº »ì¾Æ³²Àº °¡Àå ¹½°°Àº À¯´Ï¿ÂÀÎ struct in_addr ¿¡ ´ëÇÑ º¸´Ù ½ÅÁßÇÑ °ËÅä°¡ ÇÊ¿äÇÒ °Í°°´Ù.
/* Internet address (a structure for historical reasons) */ struct in_addr { unsigned long s_addr; };
À½.. ÀÌ°ÍÀº À¯´Ï¿Â "À̾ú¾ú"´Ù. ±×·¯³ª ±×·± ½ÃÀýÀº Áö³ª°¬´Ù. ½Ã¿øÇÏ°Ô ¾ø¾îÁ³±º! µû¶ó¼ ¸¸¾à "ina"¸¦ struct sockaddr_inÇüÀ¸·Î Á¤ÀÇÇØ ³õ¾Ò´Ù¸é ina.sin_addr.s_addr ·Î NBO »óÅÂÀÇ 4¹ÙÀÌÆ® ÀÎÅÍ³Ý ¾îµå·¹½º¸¦ Á¤È®ÇÏ°Ô ÂüÁ¶ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÌ struct in_addr¿¡ ±× ²ûÂïÇÑ À¯´Ï¿ÂÀ» ¾ÆÁ÷µµ »ç¿ëÇÏ°í ÀÖ´õ¶óµµ #defines S ´öºÐ¿¡ À§¿¡ ÇÑ°Í°ú ¸¶Âù°¡Áö·Î Á¤È®ÇÏ°Ô ÂüÁ¶ÇÒ ¼ö´Â ÀÖÀ» °ÍÀÌ´Ù.
ÀÌÁ¦ ´ÙÀ½ Àý·Î ¿Ô´Ù. ³×Æ®¿öÅ©¿Í È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼¿¡ ´ëÇؼ ¸»ÀÌ ³Ê¹« ¸¹¾Ò°í ÀÌÁ¦´Â ½ÇÁ¦ ¿òÁ÷ÀÏ ¶§¶ó°í º»´Ù.
ÁÁ´Ù. µÎ°¡Áö ÇüÅÂÀÇ º¯È¯ÀÌ Àִµ¥ Çϳª´Â short(2 ¹ÙÀÌÆ®)¿Í long(4¹ÙÀÌÆ®)ÀÇ °æ¿ìÀÌ´Ù. ÀÌ ÇÔ¼öµéÀº unsignedº¯¼ö¿¡¼µµ Àß ÀÛµ¿µÈ´Ù. ÀÌÁ¦ shortº¯¼ö¸¦ È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼¿¡¼ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î º¯È¯ÇÏ´Â °æ¿ì¸¦ º¸ÀÚ. È£½ºÆ®ÀÇ h ·Î ½ÃÀÛÇؼ to ¸¦ ³Ö°í ³×Æ®¿öÅ©ÀÇ n À» ³ÖÀº ÈÄ shortÀÇ s ¸¦ ³Ö´Â´Ù. ±×·¡¼ htons()ÀÌ´Ù. (Àбâ´Â È£½ºÆ® Åõ ³×Æ®¿öÅ© ¼îÆ®ÀÌ´Ù.)
³Ê¹« ½¬¿î°¡?
»ç½Ç h,n,s,l ÀÇ ¾î¶² Á¶ÇÕµµ »ç¿ë°¡´ÉÇÏ´Ù. (¹°·Ð ³Ê¹« ¹Ùº¸½º·¯¿î Á¶ÇÕÀ» ÇÏÁö´Â ¾Ê°ÚÁö..¿¹¸¦ µé¾î stolh, ¼îÆ® Åõ ·Õ È£½ºÆ®?? ÀÌ·±°Ç ¾ø´Ù. Àû¾îµµ ÀÌ µ¿³×¿¡¼´Â¾ø´Ù.) ÀÖ´Â °ÍµéÀº ´ÙÀ½°ú °°´Ù.
¾Æ¸¶µµ ÀÌÁ¦ »ó´çÈ÷ ¸¹ÀÌ ¾Ë°ÔµÈ °Í°°ÀÌ »ý°¢µéÀ» ÇÒ °ÍÀÌ´Ù. "charÀÇ ¹ÙÀÌÆ® ¼ø¼¸¦ ¾î¶»°Ô ¹Ù²ÙÁö?(¿ªÀÚÁÖ: ÀÌ Áú¹®Àº ¾Æ¸¶ Àǹ̾ø´Â Áú¹®À¸·Î ÇÑ °Í °°Àºµ¥ ´äµµ ¾ø°í ´õÀÌ»óÀÇ ¾ð±ÞÀÌ ¾ø´Â °ÍÀ¸·Î º¸¾Æ »©°í ½ÍÀº ºÎºÐÀÌ´Ù.)" ¶Ç´Â "¿°·Á¸¶, ³»°¡ ¾²´Â 68000 ±â°è´Â ÀÌ¹Ì ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î Á¤¼ö¸¦ ÀúÀåÇÏ´Ï±î º¯È¯ÇÒ ÇÊ¿ä´Â ¾ø¾î " ¶ó°í »ý°¢ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ²À ±×·¸Áö¸¸Àº ¾Ê´Ù. ±×·¸°Ô ÀÛ¼ºµÈ ÇÁ·Î±×·¥À» ´Ù¸¥ ±â°è¿¡¼ ÀÛµ¿½ÃŲ´Ù¸é ´ç¿¬È÷ ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ¿©±â´Â À¯´Ð½º ¼¼°è°í À̱âÁ¾°£ÀÇ È£È¯¼ºÀº ¸Å¿ì Áß¿äÇÑ °ÍÀÌ´Ù. ¹Ýµå½Ã ³×Æ®¿öÅ©¿¡ µ¥ÀÌÅ͸¦ º¸³»±â Àü¿¡ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î ¹Ù²ã¼ º¸³½´Ù´Â °ÍÀ» ±â¾ïÇÒ Áö¾î´Ù.
³¡À¸·Î sin_addr, sin_port´Â ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î ±â·ÏÇϴµ¥ ¿Ö sin_family´Â ¾È ±×·¯´Â°¡? ´äÀº °£´ÜÇÏ´Ù. sin_addr°ú sin_port´Â ĸ½¶ÈµÇ¾î ³×Æ®¿öÅ©·Î Àü¼ÛµÇ¾î¾ß ÇÏ´Â º¯¼öÀÎ °ÍÀÌ´Ù. µû¶ó¼ ´ç¿¬È÷ NBO¿©¾ß ÇÑ´Ù. ±×·¯³ª sin_family´Â ½Ã½ºÅÛ ³»ºÎ¿¡¼ Ä¿³Î¿¡ ÀÇÇؼ¸¸ »ç¿ëµÇ´Â º¯¼öÀÌ¸ç ³×Æ®¿öÅ©·Î Àü¼ÛµÇÁö ¾Ê´Â °ÍÀ̹ǷΠȣ½ºÆ® ¹ÙÀÌÆ® ¼ø¼·Î ±â·ÏµÇ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.
´ÙÇེ·´°Ôµµ IPÁÖ¼Ò¸¦ »êÁ¤ÇØ ÁÖ´Â ¼ö¸¹Àº ÇÔ¼öµéÀÌ ÀÖÀ¸¸ç µû¶ó¼ 4¹ÙÀÌÆ®ÀÇ longº¯¼ö¿¡ Á÷Á¢ °è»êÇؼ << ¿¬»êÀÚ¸¦ ÀÌ¿ëÇؼ Áý¾î³Ö¾î¾ß ÇÏ´Â ¼ö°í´Â ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
¸ÕÀú struct sockaddr_IN ina°¡ Á¤ÀǵǾî ÀÖ°í 132.241.5.10 ÀÌ IP ÁÖ¼ÒÀ̸ç ÀÌ °ªÀ» º¯¼ö¿¡ ³Ö¾î¾ß ÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ. inet_addr()ÇÔ¼ö°¡ ¹Ù·Î ÀÌ·²¶§ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ±× ÇÔ¼ö´Â ¼ýÀÚ¿Í Á¡À¸·Î ±¸¼ºµÈ IPÁÖ¼Ò¸¦ unsigned long º¯¼ö¿¡ Áý¾î ³Ö¾î ÁØ´Ù. ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
ina.sin_addr.s_addr = inet_addr("132.241.5.10")
inet_addr()´Â °á°ú°ªÀ¸·Î ÀÌ¹Ì NBOÀÎ °ªÀ» µ¹·ÁÁÖ¸ç ±»ÀÌ htonl()À» ¶Ç »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸ÚÁö±º!
±×·¯³ª À§ÀÇ Â©¸·ÇÑ ÄÚµå´Â ±×·¸°Ô °ß½ÇÇØ º¸ÀÌÁø ¾Ê´Â´Ù. ¿Ö³ÄÇϸé inet_addr()Àº ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ°Ô µÇ¸ç unsigned long¿¡¼ -1Àº 255.255.255.255¸¦ ÀǹÌÇÑ´Ù. ÀÌ´Â ÀÎÅÍ³Ý ºê·Îµåij½ºÆ® ¾îµå·¹½º°¡ µÈ´Ù. ³ª»Û ³à¼®. Ç×»ó ¿¡·¯ 󸮸¦ È®½ÇÈ÷ Çϴ°ÍÀÌ ÁÁ´Ù.
ÁÁ´Ù. ÀÌÁ¦ IPÁÖ¼Ò¸¦ long¿¡ ³Ö´Â°ÍÀº ¾Ë¾Ò´Âµ¥ ±× ¹Ý´ë´Â ¾î¶»°Ô ÇÒ °ÍÀΰ¡? ¸¸¾à¿¡ °ªÀÌ µé¾îÀÖ´Â struct in_addrÀº °¡Áö°í Àִµ¥ À̸¦ ¼ýÀÚ¿Í Á¡À¸·Î Ç¥½ÃÇÏ·Á¸é? ÀÌ °æ¿ì´Â inet_ntoa()¸¦ ¾²¸é µÈ´Ù.(ntoa ´Â ³×Æ®¿öÅ© Åõ ¾Æ½ºÅ°ÀÌ´Ù.)
printf("%s",inet_ntoa(ina.sin_addr));
À§ÀÇ ÄÚµå´Â IPÁÖ¼Ò¸¦ ÇÁ¸°Æ® ÇØ ÁÙ°ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â long º¯¼ö°¡ ¾Æ´Ï¶ó struct in_addr ¸¦ º¯¼ö·Î ¹Þ¾Æ µéÀδٴ Á¡À» ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼ö´Â char ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °á°ú·Î µ¹·Á Áִµ¥ ÀÌ´Â ÇÔ¼ö³»¿¡ static ÇÑ °ø°£¿¡ ÀúÀåµÇ¸ç µû¶ó¼ ¸Å¹ø ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀº º¯ÈÇÑ´Ù´Â °ÍÀÌ´Ù. Áï ¿¹¸¦ µé¸é,
char *a1, *a2; . . a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */ a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */ printf("address 1: %s\n",a1); printf("address 2: %s\n",a2);
ÀÇ Ãâ·ÂÀº ÀÌ·¸°Ô ³ª¿Ã °ÍÀÌ´Ù.
address 1: 132.241.5.10 address 2: 132.241.5.10
¸¸¾à¿¡ ÀÌ °ªÀ» ÀúÀåÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é strcpy()¸¦ ÀÌ¿ëÇÏ¿© °íÀ¯ÀÇ char ¹è¿¿¡ ÀúÀåÇØ¾ß ÇÒ °ÍÀÌ´Ù.
ÀÌÀý¿¡¼ ¾ê±âÇÒ °ÍÀº ´Ù Çß´Ù. ³ªÁß¿¡ "whitehouse.gov" ¹®ÀÚ¿À» ÇØ´çÇÏ´Â IPÁÖ¼Ò·Î ¹Ù²Ù´Â ¹ýÀ» ¾Ë·Á ÁÙ°ÍÀÌ´Ù. (DNSÀý ÂüÁ¶)
¾ÈÇÏ¸é ¸ÂÀ»°Í °°¾Æ¼ socket() ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇؼ ¾ê±âÇؾ߸¸ ÇÒ°Í°°´Ù. ÀÌ°É Àá±ñ º¸ÀÚ.
#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);
±×·±µ¥ ÀÌ º¯¼öµéÀº ¶Ç ¹º°¡? ù° domain Àº struct sockaddr_in ¿¡¼Ã³·³ AF_INET ·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ´ÙÀ½ type Àº SOCK_STREAMÀ̳ª SOCK_DGRAMÀ¸·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ³¡À¸·Î protocolÀº 0À¸·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. (¾ð±ÞÇÏÁö ¾Ê¾ÒÁö¸¸ ´õ ¸¹Àº domain°ú ´õ ¸¹Àº type ÀÌ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. socket() ¸ÇÆäÀÌÁö¸¦ Âü°íÇÏ°í ¶ÇÇÑ protocol ¿¡ ´ëÇؼ Á»´õ ¾Ë·Á¸é getprotobyname()À» ÂüÁ¶ÇÏ¸é µÈ´Ù.)
socket()Àº ¹Ù·Î ³ªÁß¿¡ »ç¿ëÇÒ ¼ÒÄÏ ±â¼úÀÚÀÎ Á¤¼ö°ªÀ» µ¹·ÁÁÖ¸ç ¿¡·¯½Ã¿¡´Â -1À» µ¹·ÁÁÖ°Ô µÈ´Ù. Àü¿ªº¯¼öÀÎ errno¿¡ ¿¡·¯°ªÀÌ ±â·ÏµÈ´Ù. (perror()ÀÇ ¸ÇÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)
ÀÏ´Ü ¼ÒÄÏÀ» ¿°Ô µÇ¸é ÀÌ ¼ÒÄÏÀ» ÇöÀç ½Ã½ºÅÛÀÇ Æ÷Æ®¿¡ ¿¬°á½ÃÄÑ ÁÖ¾î¾ß ÇÑ´Ù. (ÀÌ ÀÛ¾÷Àº º¸Åë listen()ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ ¿ÜºÎÀÇ Á¢¼ÓÀ» ´ë±âÇÒ ¶§ ½ÃÇàµÇ¸ç ÀϹÝÀûÀ¸·Î ¸Óµå°ÔÀÓ »çÀÌÆ®µéÀÌ telnet *.*.*.* 6969 ·Î Á¢¼ÓÇ϶ó°í ÇÒ¶§µµ ÀÌ ÀÛ¾÷À» ½ÃÇàÇß´Ù´Â ÀǹÌÀÌ´Ù. ) ¸¸¾à¿¡ ±×Àú ´Ù¸¥ È£½ºÆ®¿¡ ¿¬°áÇϱ⸸ ÇÒ ¿¹Á¤À̶ó¸é ±×³É connect()¸¦ »ç¿ëÇÏ¿© ¿¬°á¸¸ ÇÏ¸é µÇ°í ÀÌ ÀÛ¾÷Àº ÇÊ¿ä°¡ ¾ø´Ù.
¾Æ·¡´Â bind() ½Ã½ºÅÛ È£ÃâÀÇ ¼±¾ðÀÌ´Ù.
#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd´Â socket()ÇÔ¼ö¿¡¼ ¾òÀº ¼ÒÄÏ ±â¼úÀÚÀ̸ç my_addrÀº IP ÁÖ¼Ò¿¡ °üÇÑ Á¤º¸(Áï, IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£)¸¦ ´ã°í ÀÖ´Â struct sockaddr ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ ÀÌ°í addrlenÀº ±× ±¸Á¶Ã¼ÀÇ »çÀÌÁî(sizeof(struct sockaddr))ÀÌ´Ù.
ÈÞ~~ Çѹ濡 ¹Þ¾ÆµéÀ̱⿡´Â Á» ±×·¸±º. ¿¹¸¦ º¸ÀÚ.
#include <string.h> #include <sys/types.h> #include <sys/socket.h> #define MYPORT 3490 main() { int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = inet_addr("132.241.5.10"); bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ /* don't forget your error checking for bind(): */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); . . .
¸î°¡Áö ÁÖÀÇÇÒ Á¡Àº my_addr.sin_port ´Â my_addr.sin_addr.s_addr°ú °°ÀÌ NBOÀÌ´Ù. ¶ÇÇÑ Çì´õÈÀÏÀº °¢°¢ÀÇ ½Ã½ºÅÛ¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î °¢ÀÚÀÇ ½Ã½ºÅÛÀÇ ¸Ç ÆäÀÌÁö¸¦ Âü°íÇØ¾ß ÇÒ °ÍÀÌ´Ù.
¸¶Áö¸·À¸·Î bind()¿Í °ü·ÃÇؼ ÁÖ¼Ò³ª Æ÷Æ®ÀÇ ÁöÁ¤ÀÌ ¶§¿¡ µû¶ó¼ ÀÚµ¿È µÉ ¼öµµ ÀÖ´Ù´Â °ÍÀ» ¾ð±ÞÇØ¾ß ÇÒ °Í°°´Ù.
my_addr.sin_port = 0; /* choose an unused port at random */ my_addr.sin_addr.s_addr = INADDR_ANY; /* use my IP address */
my_addr.sin_port¸¦ 0À¸·Î ÁöÁ¤Çϸé ÀÚµ¿À¸·Î »ç¿ëµÇÁö ¾Ê°í ÀÖ´Â Æ÷Æ® ¹øÈ£¸¦ ÁöÁ¤ÇØ ÁÙ°ÍÀ̸ç my_addr.sin_addr.s_addr¸¦ INADDR_ANY·Î ÁöÁ¤ÇÒ °æ¿ì ÇöÀç ÀÛµ¿µÇ°í ÀÖ´Â ÀÚ½ÅÀÇ IPÁÖ¼Ò¸¦ ÀÚµ¿À¸·Î ÁöÁ¤ÇØ ÁÖ°Ô µÈ´Ù.
¸¸¾à ¿©±â¼ ¾à°£¸¸ ÁÖÀǸ¦ ±â¿ï¿´´Ù¸é INADDR_ANY¸¦ ÁöÁ¤ÇÒ ¶§ NBO·Î ¹Ù²Ù´Â °ÍÀ» »©¸ÔÀº °ÍÀ» ´«Ä¡Ã§ °ÍÀÌ´Ù. ³ª¾Æ»Û~~. ±×·¯³ª ³ ³»ºÎÁ¤º¸¸¦ ¾Ë°í ÀÖÁö·Õ. »ç½ÇÀº INADDR_ANY´Â 0ÀÌ´Ù. 0Àº ¼ø¼¸¦ ¹Ù²Ù¾îµµ 0ÀΰÍÀÌ´Ù. ±×·¯³ª ¼ø¼öÀÌ·ÐÀûÀÎ Ãø¸é¿¡¼ INADDR_ANY°¡ ±×·¯´Ï±î 12Á¤µµÀÎ ¼¼°è°¡ Á¸ÀçÇÑ´Ù¸é ÀÌ ÄÚµå´Â ÀÛµ¿ ¾ÈÇÒ°ÍÀÌ´Ù. ±×·¡¼? ³ »ó°ü¾ø´Ù. Á¤ ±×·¸´Ù¸é,
my_addr.sin_port = htons(0); /* choose an unused port at random */ my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* use my IP address */
ÀÌÁ¦´Â ¹Ï±â ¾î·Á¿ï Á¤µµ·Î À̽İ¡´ÉÇÑ Äڵ尡 µÇ¾ú´Ù. ´Ù¸¸ ÁöÀûÇÏ°í ½ÍÀº °ÍÀº ÀÛµ¿ÇÏ´Â µ¥¿¡´Â ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù´Â Á¡ÀÌ´Ù.
bind()¶ÇÇÑ ¿¡·¯°¡ ³µÀ»¶§ -1À» µ¹·ÁÁÖ¸ç errno¿¡ ¿¡·¯ÀÇ Äڵ尡 ³²°Ô µÈ´Ù.
bind()¸¦ È£ÃâÇÒ ¶§ ÁÖÀÇÇÒÁ¡ : Àý´ë Á¦ÇѼ± ¾Æ·¡·Î Æ÷Æ®¹øÈ£¸¦ ³»¸®Áö ¸»¶ó´Â °ÍÀÌ´Ù. 1024 ¾Æ·¡ÀÇ ¹øÈ£´Â ¸ðµÎ ¿¹¾àµÇ¾î ÀÖ´Ù. ±× À§·Î´Â 65535±îÁö ¿øÇÏ´Â ´ë·Î ¾µ ¼ö°¡ ÀÖ´Ù. (´Ù¸¥ ÇÁ·Î±×·¥ÀÌ ¾²°í ÀÖÁö ¾ÊÀº °æ¿ì¿¡ ÇÑÇؼ..)
¶Ç ÇϳªÀÇ ÀÛÀº ²¿¸®¸» : bind() ¸¦ È£ÃâÇÏÁö ¾Ê¾Æµµ µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ¸¸ÀÏ ´Ù¸¥ È£½ºÆ®¿¡ ¿¬°á (connect())ÇÏ°íÀÚ ÇÏ´Â °æ¿ì¿¡´Â ÀÚ½ÅÀÇ Æ÷Æ®¿¡´Â (ÅÚ³ÝÀÇ °æ¿ìó·³)ÀüÇô ½Å°æ ¾µ ÇÊ¿ä°¡ ¾ø´Ù. ´ÜÁö connect()¸¦ È£ÃâÇϱ⸸ ÇÏ¸é ¾Ë¾Æ¼ bind°¡ µÇ¾î ÀÖ´ÂÁö¸¦ üũÇؼ ºñ¾îÀÖ´Â Æ÷Æ®¿¡ bind¸¦ ÇØÁØ´Ù.
ÀÌÁ¦ Àá±ñ¸¸ ¸¶Ä¡ ÀÚ½ÅÀÌ ÅÚ³Ý ÇÁ·Î±×·¥ÀÎ °Íó·³ »ý°¢ÇØ º¸±â·Î ÇÏÀÚ. ´ç½ÅÀÇ »ç¿ëÀÚ´Â ¸í·ÉÇϱ⸦ (TRON¿µÈ¿¡¼Ã³·³.. (¿ªÀÚ: ³ ±× ¿µÈ ¾È ºÃ´Âµ¥..)) ¼ÒÄÏ ±â¼úÀÚ¸¦ ¾ò¾î¿À¶ó Çß°í ´ç½ÅÀº Áï½Ã socket()¸¦ È£ÃâÇß´Ù. ´ÙÀ½¿¡ »ç¿ëÀÚ´Â 132.241.5.10 ¿¡ Æ÷Æ® 23(Á¤±Ô ÅÚ³Ý Æ÷Æ®¹øÈ£)¿¡ ¿¬°áÇ϶ó°í ÇÑ´Ù. À¹, ÀÌÁ¨ ¾î¶»°Ô ÇÏÁö?
´ÙÇེ·´°Ôµµ ´ç½Å(ÇÁ·Î±×·¥)Àº connect()Àý(¾î¶»°Ô ¿¬°áÇϴ°¡)¸¦ ½É°¢ÇÏ°Ô Àаí ÀÖÀ¸¸ç ´ç½ÅÀÇ ÁÖÀÎÀ» ½Ç¸Á½ÃÅ°Áö ¾ÊÀ¸·Á°í ¹ÌÄ£µíÀÌ Àо°¡´Â ÁßÀ̷δÙ~~
connet()´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.
#include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd´Â ÀÌÁ¦´Â Ä£¼÷ÇØÁø ¼ÒÄÏ ±â¼úÀÚÀ̸ç serv_addrÀº ¿¬°áÇÏ°íÀÚ ÇÏ´Â ¸ñÀûÁöÀÎ ¼¹öÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¿¡ °üÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â struct sockaddr À̸ç addrlenÀº ¾Õ¿¡¼ À̾߱â ÇÑ°Í°ú °°ÀÌ ±× ±¸Á¶Ã¼ÀÇ Å©±âÀÌ´Ù.
¹º°¡ Á» ÀÌÇØ°¡ °¥µí ÇÏÁö ¾ÊÀº°¡? ¿¹¸¦ µé¾î º¸ÀÚ.
#include <string.h> #include <sys/types.h> #include <sys/socket.h> #define DEST_IP "132.241.5.10" #define DEST_PORT 23 main() { int sockfd; struct sockaddr_in dest_addr; /* will hold the destination addr */ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ dest_addr.sin_family = AF_INET; /* host byte order */ dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */ dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); bzero(&(dest_addr.sin_zero), 8); /* zero the rest of the struct */ /* don't forget to error check the connect()! */ connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); . . .
´Ù½Ã ¸»Çϰǵ¥ connect()ÀÇ °á°ú°ªÀ» Çѹø üũÇØ ºÁ¾ß ÇÑ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» µ¹·ÁÁÖ°í errno¸¦ ¼¼ÆÃÇϱ⠶§¹®ÀÌ´Ù.
¶ÇÇÑ bind()¸¦ È£ÃâÇÏÁö ¾ÊÀº °Í¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¿©±â¼´Â ÀÚ½ÅÀÇ Æ÷Æ® ¹øÈ£¿¡´Â °áÄÚ °ü½ÉÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ´ÜÁö ¾îµð·Î °¡´Â°¡¸¸ÀÌ Áß¿äÇÏ´Ù. Ä¿³ÎÀÌ ¾Ë¾Æ¼ ·ÎÄà Æ÷Æ®¸¦ ¼±Á¤ÇØ ÁÙ °ÍÀÌ¸ç ¿ì¸®°¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â °÷¿¡¼´Â ÀÚµ¿À¸·Î ÀÌ Á¤º¸¸¦ ¾Ë°Ô µÉ °ÍÀÌ´Ù.
ÀÌÁ¦ º¸Á¶¸¦ ¹Ù²Ù¾î¼, ¸¸¾à¿¡ ¾îµð·Ð°¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÜºÎ·ÎºÎÅÍÀÇ Á¢¼ÓÀ» ´ë±âÇؼ Á¢¼ÓÀÌ ¿Ã °æ¿ì ¾î¶² ¹æ½ÄÀ¸·ÎµçÁö °£¿¡ 󸮸¦ ÇØ ÁÖ¾î¾ß ÇÏ´Â °æ¿ì¶ó¸é ¾îÂî ÇÒ °ÍÀΰ¡. ÀÌ ÀÛ¾÷Àº µÎ ´Ü°è·Î ÀÌ·ç¾îÁø´Ù. ¸ÕÀú listen()À» ÇØ¾ß µÇ°í ±× ´ÙÀ½¿¡ accept()¸¦ ÇØ¾ß µÈ´Ù´Â °ÍÀÌ´Ù.
listen()Àº »ó´çÈ÷ °£´ÜÇÏÁö¸¸ ¾à°£ÀÇ ¼³¸íÀº ÇÊ¿äÇÏ´Ù.
int listen(int sockfd, int backlog);
sockfd´Â º¸ÅëÀÇ ¼ÒÄÏ ±â¼úÀÚÀ̸ç backlog´Â Á¢¼Ó´ë±â Å¥ÀÇ ÃÖ´ë ¿¬°á °¡´É ¼ýÀÚÀÌ´Ù. ±×°Ç ¶Ç ¹º ¾ê±âÀΰ¡? ¿ÜºÎ·ÎºÎÅÍÀÇ ¿¬°áÀº ÀÌ ´ë±â Å¥¿¡¼ accept()°¡ È£ÃâµÉ ¶§±îÁö ±â´Ù·Á¾ß ÇÑ´Ù´Â °ÍÀÌ¸ç ¼ýÀÚ´Â ¹Ù·Î ¾ó¸¶³ª ¸¹Àº Á¢¼ÓÀÌ ÀÌ Å¥¿¡ ½×¿©Áú ¼ö Àִ°¡ ÇÏ´Â °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛÀº ÀÌ ¼ýÀÚ¸¦ Á¶¿ëÇÏ°Ô 20Á¤µµ¿¡¼ Á¦ÇÑÇÏ°í ÀÖÀ¸¸ç º¸ÅëÀº 5¿¡¼ 10 »çÀÌ·Î ÁöÁ¤ÇÏ°Ô µÈ´Ù.
¶Ç ´Ù½Ã listen()µµ ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.
¾Æ¸¶ »ó»óÇÒ ¼ö ÀÖµíÀÌ listen()º¸´Ù ¾Õ¼¼ bind()¸¦ È£ÃâÇØ¾ß ÇÏ¸ç ¸¸¾à¿¡ bind()°¡ µÇÁö ¾ÊÀ¸¸é ¿ì¸®´Â ·£´ýÇÏ°Ô ÁöÁ¤µÈ Æ÷Æ®¿¡¼ ¿ÜºÎÀÇ Á¢¼ÓÀ» ±â´Ù·Á¾ß ÇÑ´Ù. (Æ÷Æ®¸¦ ¸ð¸£°í¼ ´©°¡ Á¢¼ÓÇÒ ¼ö Àְڴ°¡? ¿ì¿¢~~) µû¶ó¼ ¿ÜºÎÀÇ Á¢¼ÓÀ» ±â´Ù¸®´Â °æ¿ì¶ó¸é ´ÙÀ½ ¼ø¼´ë·Î ÀÛ¾÷ÀÌ ÁøÇàµÇ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.
socket(); bind(); listen(); /* accept() goes here */
À§ÀÇ °Í¸¸À¸·Îµµ ÀÌÇØ°¡ °¥¸¸ÇÏ´Ù°í º¸°í ¿¹Á¦¿¡ ´ë½ÅÇÏ°Ú´Ù. (accept()Àý¿¡ º¸´Ù ±¦ÂúÀº Äڵ尡 ÁغñµÇ¾î ÀÖ´Ù.) ÀÌ ¸ðµç sha-bang(¿ªÀÚ: ÀÌ ¹¹²¿?)Áß¿¡¼ °¡Àå Çò°¥¸®´Â ºÎºÐÀº accept()¸¦ ºÎ¸£´Â ºÎºÐÀÌ´Ù.
Áغñ! accept()¸¦ È£ÃâÇÏ´Â °ÍÀº ¹º°¡ Á» ¼ö»óÇϱä ÇÏ´Ù. °ú¿¬ ¹¹°¡ ¹ú¾îÁö´Â°¡? Àú ¸Ö¸® ¶³¾îÁø °÷¿¡¼ ´©±º°¡°¡ connect()¸¦ È£ÃâÇÏ¿© ´ç½ÅÀÌ listen()À» È£ÃâÇÏ°í ±â´Ù¸®´Â Æ÷Æ®¿¡ Á¢¼ÓÀ» ½ÃµµÇÑ´Ù. ±×µéÀÇ ¿¬°áÀº ¹Ù·Î accept()°¡ È£ÃâµÇ±â ±îÁö Å¥¿¡¼ ¹Ù·Î ´ç½ÅÀÌ accept()¸¦ È£ÃâÇÏ¿© ±× ¿¬°áÀ» Áö¼ÓÇ϶ó°í ¸í·ÉÇÒ ¶§±îÁö ´ë±âÇÏ°Ô µÈ´Ù. ±×·¯¸é ÀÌ ÇÔ¼ö´Â ¿À·ÎÁö ÀÌ ¿¬°áÀ» À§ÇÑ ¿ÏÀüÈ÷ ½ÅÁ¦Ç° ¼ÒÄÏ ÆÄÀÏ ±â¼úÀÚ¸¦ µ¹·ÁÁÖ°Ô µÈ´Ù. °©Àڱ⠴ç½ÅÀº Çϳª°ªÀ¸·Î µÎ°³ÀÇ ¼ÒÄÏ ±â¼úÀÚ¸¦ °®°Ô µÇ´Â °ÍÀÌ´Ù. ¿ø·¡ÀÇ °ÍÀº ¾ÆÁ÷µµ ±× Æ÷Æ®¿¡¼ ¿¬°áÀ» listen()ÇÏ°í ÀÖ´Ù. ¶Ç Çϳª´Â »õ·Ó°Ô âÁ¶µÇ¾î µåµð¾î send()¿Í recv()¸¦ ÇÒ Áغñ°¡ µÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
µåµð¾î ¿©±â±îÁö ¿Ô´Ù! °¨°Ý~~
¼±¾ðÀº ¾Æ·¡¿Í °°´Ù.
#include <sys/socket.h> int accept(int sockfd, void *addr, int *addrlen);
sockfd´Â listen()ÇÏ°í ÀÖ´Â ¼ÒÄÏÀÇ ±â¼úÀÚÀÌ´Ù. »·ÇÏÁö ¹¹.. addrÀº ·ÎÄà struct sockaddr_inÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ¿©±â¿¡ µé¾î¿Â Á¢¼Ó¿¡ °üÇÑ Á¤º¸°¡ ´ã°ÜÁö°Ô µÇ°í À̸¦ ÀÌ¿ëÇؼ ¾î´À È£½ºÆ®¿¡¼ ¾î´À Æ÷Æ®¸¦ ÀÌ¿ëÇؼ Á¢¼ÓÀÌ µé¾î¿Ô´ÂÁö¸¦ ¾Ë ¼ö ÀÖ°Ô µÈ´Ù. addrlenÀº ·ÎÄà Á¤¼ö º¯¼öÀ̸ç ÀÌ Á¤¼ö¿¡´Â struct sockaddr_inÀÇ Å©±â°¡ ¹Ì¸® ÁöÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ¼ýÀÚº¸´Ù ´õ ¸¹Àº ¹ÙÀÌÆ®ÀÇ Á¤º¸°¡ µé¾î¿À¸é accept()´Â ¹Þ¾Æ µéÀÌÁö ¾ÊÀ» °ÍÀ̸ç Àûµ¥ µé¾î¿Â´Ù¸é addrlenÀÇ °ªÀ» ÁÙ¿© ÁÙ °ÍÀÌ´Ù.
accept() ´Â ¿¡·¯°¡ ³µÀ» °æ¿ì¿¡ ¾î¶»°Ô ÇÑ´Ù°í? -1À» µ¹·ÁÁÖ°í errno ¸¦ ¼¼ÆÃÇÑ´Ù.
¾Æ±î ¸ÇÄ¡·Î Çѹ濡 ¹Þ¾ÆµéÀ̱⿡´Â Á» ±×·¯´Ï±î ¿¹Á¦¸¦ ¿½ÉÈ÷ ÀÐ¾î º¸ÀÚ.
#include <string.h> #include <sys/types.h> #include <sys/socket.h> #define MYPORT 3490 /* the port users will be connecting to */ #define BACKLOG 10 /* how many pending connections queue will hold */ main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ /* don't forget your error checking for these calls: */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); listen(sockfd, BACKLOG); sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, &their_addr, &sin_size); . . .
ÀÌÁ¦ new_fd¸¦ ÀÌ¿ëÇؼ send()¿Í recv()¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸¸¾à ¿øÇÑ´Ù¸é ´õÀÌ»óÀÇ ¿¬°áÀ» ¹Þ¾ÆµéÀÌÁö ¾Ê°í ÇϳªÀÇ ¿¬°á¸¸ ÀÌ¿ëÇϱâ À§Çؼ close()¸¦ ÀÌ¿ëÇÏ¿© ¿ø·¡ÀÇ sockfd¸¦ ¸·¾Æ ¹ö¸± ¼öµµ ÀÖ´Ù.
ÀÌ µÎ ÇÔ¼ö´Â ½ºÆ®¸² ¼ÒÄÏÀ̳ª ¿¬°áµÈ µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ§¿¡¼ Á¤º¸¸¦ ÁÖ°í ¹ÞÀ»¶§ »ç¿ëÇÏ´Â °ÍµéÀÌ´Ù. ¸¸¾à º¸ÅëÀÇ ºñ¿¬°á µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù¸é sendto()¿Í recvfrom()ÀýÀ» ÂüÁ¶Çϵµ·Ï ÇÑ´Ù.
send() È£ÃâÀÇ ¼±¾ðÀº ¾Æ·¡¿Í °°´Ù.
int send(int sockfd, const void *msg, int len, int flags);
sockfd´Â socket()¸¦ ÅëÇؼ ¾ò¾ú°Å³ª accept()¸¦ ÅëÇؼ »õ·Î ±¸ÇÑ, µ¥ÀÌÅ͸¦ º¸³¾ ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç, msg´Â º¸³¾ µ¥ÀÌÅ͸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ, lenÀº º¸³¾ µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ® ¼ö À̸ç flags ´Â ±×³É 0À¸·Î ÇØ¾ß ÇÑ´Ù. (Ç÷¡±×¿¡ °üÇÑ º¸´Ù ÀÚ¼¼ÇÑ ³»¿ëÀº send()ÀÇ ¸Ç ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)
¾à°£ÀÇ ¿¹Á¦°¡ ´ÙÀ½°ú °°´Ù.
char *msg = "Beej was here!"; int len, bytes_sent; . . len = strlen(msg); bytes_sent = send(sockfd, msg, len, 0); . . .
send()´Â °á°ú°ªÀ¸·Î º¸³»Áø ¸ðµç ¹ÙÀÌÆ® ¼ö¸¦ µ¹·ÁÁִµ¥ ÀÌ°ÍÀº º¸³»¶ó°í ÇÑ ¼ýÀÚº¸´Ù ÀÛÀ» ¼öµµ ÀÖ´Ù. °¡²ûÀº º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍÀÇ Å©±â°¡ ¹Ìó °¨´çÇÏÁö ¸øÇÒ ¸¸ÇÑ ¼ýÀÚÀÎ °æ¿ìµµ ÀÖÀ¸¸ç ÀÌ °æ¿ì send()´Â ÀڱⰡ °¨´çÇÒ ¼ö ÀÖ´Â ¼ýÀÚ¸¸Å¸¸ º¸³»°í ³ª¸ÓÁö´Â À߶ó ¹ö¸°ÈÄ ´ç½ÅÀÌ ±× ³ª¸ÓÁö¸¦ ´Ù½Ã º¸³» ÁÙ °ÍÀ¸·Î ±â´ëÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à¿¡ º¸³»¶ó°í ÇÑ µ¥ÀÌÅÍÀÇ Å©±âº¸´Ù ÀÛÀº ¼ýÀÚ°¡ °á°ú°ªÀ¸·Î µ¹¾Æ ¿Ô´Ù¸é ±× ³ª¸ÓÁö µ¥ÀÌÅ͸¦ º¸³»´Â °ÍÀº ÀüÀûÀ¸·Î ´ç½ÅÀÇ Ã¥ÀÓÀÎ °ÍÀÌ´Ù. ±×³ª¸¶ Èñ¼Ò½ÄÀº µ¥ÀÌÅÍÀÇ »çÀÌÁî°¡ ÀÛ´Ù¸é (1k À̳»¶ó¸é) ¾Æ¸¶µµ Çѹø¿¡ ¸ðµÎ º¸³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¶ÇÇÑ ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.
recv()ÀÇ °æ¿ìµµ »ó´çÈ÷ À¯»çÇÏ´Ù.
int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd´Â Àоî¿Ã ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç buf´Â Á¤º¸¸¦ ´ãÀ» ¹öÆÛÀÌ´Ù. lenÀº ¹öÆÛÀÇ ÃÖ´ë Å©±âÀÌ°í flags´Â 0À¸·Î ¼¼ÆÃÇØ¾ß ÇÑ´Ù. (ÀÚ¼¼ÇÑ flagsÀÇ Á¤º¸´Â recv() ¸Ç ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)
recv()´Â ½ÇÁ¦ ÀоîµéÀÎ ¹ÙÀÌÆ® ¼ýÀÚ¸¦ µ¹·ÁÁÖ¸ç ¿¡·¯ÀÇ °æ¿ì´Â -1, errno¸¦ ¼¼ÆÃÇÑ´Ù.
½¬¿üÀ»±î? ½¬¿üÁö.. ÀÌÁ¦ ´ç½ÅÀº ½ºÆ®¸² ¼ÒÄÏÀ» ÀÌ¿ëÇؼ µ¥ÀÌÅ͸¦ º¸³»°í ¹ÞÀ» ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿ì¿Í~ À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¸Ó³×~~
±¦ÂúÀº°É, À̶ó°í ¸»ÇÏ°í ÀÖ´ÂÁÙ·Î »ý°¢ÇÏ°Ú´Ù. ±×·±µ¥ µ¥ÀÌÅͱ׷¥¿¡ °üÇÑ ³ª¸ÓÁö´Â ¾îµøÁö? ³ëÇÁ¶óºí·¹¸ð~ ¾Æ¹Ì°í~(¿ªÀÚ: Å͹̳×ÀÌÅÍ2°¡ »ý°¢³ª´Â±º~~) ÀÌÁ¦ ÇÒ °ÍÀÌ´Ù.
µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ¿¬°áÀ» ÇÒ ÇÊ¿ä°¡ ¾ø´Ù¸é µ¥ÀÌÅ͸¦ º¸³»±â Àü¿¡ ÁÖ¾î¾ß ÇÒ ³ª¸ÓÁö Á¤º¸´Â ¾î¶»°Ô ÁÖ¾î¾ß Çϴ°¡? ¸Â´Ù. ¸ñÀûÁöÀÇ ÁÖ¼Ò¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ¿©±â¿¡ ¿¹Á¦°¡ ÀÖ´Ù.
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
º¸´Ù½ÃÇÇ ÀÌ ÇÔ¼ö´Â µÎ°¡Áö ºÎ°¡Á¤º¸°¡ ´õ µé¾î°£ °Í ÀÌ¿Ü¿¡´Â ±âº»ÀûÀ¸·Î send()¿Í µ¿ÀÏÇÏ´Ù. to ´Â struct sockaddrÀÇ Æ÷ÀÎÅÍÀ̸ç(¾Æ¸¶µµ struct sockaddr_in) ¿©±â¿¡´Â ¸ñÀûÁöÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£°¡ ´ã°Ü ÀÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. tolenÀº ±× ±¸Á¶Ã¼ÀÇ Å©±âÀÎ °ÍÀÌ´Ù.
send()¿Í ¸¶Âù°¡Áö·Î sendto()µµ º¸³»¾îÁø µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö¸¦ °á°ú·Î µ¹·ÁÁÖ¸ç(½ÇÁ¦ º¸³»¶ó°í ÁØ µ¥ÀÌÅÍÀÇ Å©±âº¸´Ù ÀÛÀ»Áöµµ ¸ð¸£´Â), ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁØ´Ù.
ºñ½ÁÇÏ°Ô recvfrom()µµ ¾Æ·¡¿Í °°´Ù.
int recvfrom(int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen);
¿ª½Ã À̰͵µ µÎ°¡Áö º¯¼ö°¡ ´õ ÁÖ¾îÁö°Ô µÈ´Ù. fromÀº µ¥ÀÌÅ͸¦ º¸³»´Â ÀåºñÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¸¦ ´ã°í ÀÖ´Â struct sockaddr À̸ç fromlenÀº ·ÎÄà Á¤¼öº¯¼ö·Î¼ ±¸Á¶Ã¼ÀÇ Å©±â°¡ ¼¼ÆõǾî ÀÖ¾î¾ß ÇÑ´Ù. ÇÔ¼ö°¡ È£ÃâµÈ µÚ¿¡´Â fromlen¿¡´Â ½ÇÁ¦ fromÀÇ Å©±â°¡ ¼ö·ÏµÇ°Ô µÈ´Ù.
recvfrom()Àº ½ÇÁ¦ ¹ÞÀº µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö¸¦ µ¹·ÁÁÖ¸ç ¿¡·¯ÀÇ °æ¿ì´Â -1, errno¸¦ ¼¼ÆÃÇÏ°Ô µÈ´Ù.
¸¸¾à connect()¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» ¿¬°áÇÑ ÈÄÀÇ »óȲÀ̶ó¸é °£´ÜÈ÷ send(), recv() ¸¦ »ç¿ëÇصµ »ó°ü ¾øÀ¸¸ç ¼ÒÄÏ ÀÎÅÍÆäÀ̽º´Â ÀÚµ¿À¸·Î ¸ñÀûÁö¿Í ¼Ò½º¿¡ °üÇÑ Á¤º¸¸¦ ÇÔ¼ö¿¡ Ãß°¡Çؼ ÀÛµ¿µÇ°Ô µÉ °ÍÀÌ´Ù.
ÈÞ~~ ÇÏ·çÁ¾ÀÏ µ¥ÀÌÅ͸¦ º¸³»°í ¹Þ¾Ò´õ´Ï..ÀÌÁ¦´Â ¼ÒÄÏÀ» ´ÝÀ» ¶§°¡ µÈ °ÍÀÌ´Ù. ÀÌ°Ç ½±´Ù. Á¤±Ô ÆÄÀÏ ±â¼úÀÚ¿¡ °üÇÑ close()¸¦ »ç¿ëÇÏ¸é µÇ´Â °ÍÀÌ´Ù.
close(sockfd);
ÀÌ°ÍÀ¸·Î ´õÀÌ»óÀÇ ÀÔÃâ·ÂÀº ºÒ°¡´É ÇØÁö¸ç ´©±¸µçÁö ¿ø°ÝÁö¿¡¼ ÀÌ ¼ÒÄÏ¿¡ ÀÐ°í ¾²·Á°í ÇÏ´Â ÀÚ´Â ¿¡·¯¸¦ ¹Þ°Ô µÉ °ÍÀÌ´Ù.
¾à°£ ´õ ¼¼¹ÐÇÑ Á¦¾î¸¦ À§Çؼ´Â shutdown()À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ°ÍÀ» ÀÌ¿ëÇϸé ƯÁ¤¹æÇâÀ¸·ÎÀÇ Åë½Å¸¸À» ²÷À» ¼öµµ ÀÖ°Ô µÈ´Ù.
int shutdown(int sockfd, int how);
sockfd´Â ¼ÒÄÏ ±â¼úÀÚÀ̸ç how´Â ´ÙÀ½°ú °°´Ù.
shutdown() Àº ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.
Ȳ¼ÛÇÏ¿É°Ôµµ ¿¬°áµµ µÇÁö¾ÊÀº µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡ shutdown()À» »ç¿ëÇÑ´Ù¸é ´ÜÁö send(), recv()¸¦ »ç¿ëÇÏÁö ¸øÇÏ°Ô¸¸ ¸¸µé °ÍÀÌ´Ù. connect()¸¦ »ç¿ëÇÑ °æ¿ì¿¡¸¸ ÀÌ·¸°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. (¿ªÀÚ: ±×·¸´Ù¸é sendto, recvfromÀº »ç¿ëÀÌ µÈ´Ù´Â ¾ê±âÀΰ¡??Å×½ºÆ®°¡ ÇÊ¿äÇÒµí.)
¾Ï°Íµµ ¾Æ´Ï±º.
ÀÌ ÇÔ¼ö´Â µÇ°Ô ½±´Ù.
³Ê¹« ½¬¿ö¼ ÀýÀ» µû·Î ¸¸µé ÇÊ¿ä°¡ ¾øÁö¾Ê³ª °í¹ÎÇßÁö¸¸ ¿©±â ÀÖ´Â°É º¸´Ï±î..
getpeername()Àº »ó´ëÆí ÂÊ ½ºÆ®¸² ¼ÒÄÏ¿¡ ´©°¡ ¿¬°áµÇ¾î Àִ°¡¸¦ ¾Ë·ÁÁØ´Ù.
#include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
sockfd´Â ¿¬°áµÈ ½ºÆ®¸² ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç addrÀº »ó´ëÆíÀÇ Á¤º¸¸¦ ´ã°Ô µÉ struct sockaddr(¶Ç´Â struct sockaddr_in)ÀÇ Æ÷ÀÎÅÍ À̸ç addrlenÀº Á¤¼ö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅͷμ ±¸Á¶Ã¼ÀÇ Å©±â°¡ ÁöÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
¿¡·¯ÀÇ °æ¿ì´Â -1À» µ¹·ÁÁÖ°í errno¸¦ ¼¼ÆÃÇÑ´Ù. (¿Ü¿ì°Ú±º.)
ÀÏ´Ü ÁÖ¼Ò¸¦ ¾Ë°ÔµÇ¸é inet_ntoa()³ª gethostbyaddr()À» ÀÌ¿ëÇÏ¿© Á»´õ ¸¹Àº Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ°Ô µÇÁö¸¸ »ó´ëÆíÀÇ login nameÀ» ¾Ë°ÔµÇ´Â °ÍÀº ¾Æ´Ï´Ù. (¸¸ÀÏ »ó´ëÆí¿¡ ident µ¥¸óÀÌ µ¹°í ÀÖ´Ù¸é ¾Ë¾Æ³¾ ¹æ¹ýÀÌ ¾ø´Â °ÍÀº ¾Æ´ÏÁö¸¸ ÀÌ ³»¿ëÀº ÀÌ ±ÛÀÇ ÃëÁö¸¦ ¹þ¾î³ª´Â ³»¿ëÀ̹ǷΠRFC-1413À» ÂüÁ¶Ç϶ó°í ¸»ÇÏ°í ½Í´Ù.)
getpeername()º¸´Ù ´õ ½¬¿î °ÍÀÌ ÀÌ ÇÔ¼öÀÌ´Ù. °á°ú·Î ÇÁ·Î±×·¥ÀÌ µ¹°í ÀÖ´Â ÄÄÇ»ÅÍÀÇ À̸§À» ¾Ë·ÁÁØ´Ù. À̸§Àº gethostbyname()À» ÀÌ¿ëÇÏ¿© ·ÎÄà ÀåºñÀÇ IPÁÖ¼Ò¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëµÉ ¼öµµ ÀÖ´Ù.
¹¹°¡ ´õ Àç¹ÌÀִ°¡? ¸î°¡Áö »ý°¢ÇØ º¼ ¼ö Àִµ¥ ÀÌ ¹®¼¿¡´Â ÀûÀýÇÏÁö ¾ÊÀº ³»¿ëÀÌ´Ù(¿ªÀÚ: °ú¿¬ ¹»±î..µÇ°Ô ±Ã±ÝÇϳ×..). ¾î·°Å³ª,
#include <unistd.h> int gethostname(char *hostname, size_t size);
hostnameÀº ¹®ÀÚ¿ÀÇ Æ÷ÀÎÅÍÀ̸ç ÇÔ¼ö°¡ µ¹·ÁÁÖ´Â °ªÀ» ´ã°Ô µÉ º¯¼öÀÌ´Ù. size´Â ±× ¹®ÀÚ¿ÀÇ Å©±âÀÌ´Ù.
¼º°øÀûÀ̸é 0À», ¿¡·¯ÀÇ °æ¿ì -1À» ¸®ÅÏÇÏ°í errno¸¦ ¼¼ÆÃÇÑ´Ù.
¸ð¸£´Â »ç¶÷À» À§ÇÏ¿© DNS´Â Domain Name Service ¶ó´Â °ÍÀ» ¸ÕÀú ¾ê±â ÇÏ°Ú´Ù. °£°áÇÏ°Ô ¾ê±âÇÑ´Ù¸é DNS¿¡´Ù°¡ »ç¶÷ÀÌ ÀÐÀ»¼ö ÀÖ´Â ÁÖ¼Ò¸¦ ¸»ÇØÁÖ¸é DNS´Â bind,connect,sendto,¾î·°Å³ª IPÁÖ¼Ò°¡ ÇÊ¿äÇÑ °Íµé¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â IPÁÖ¼Ò¸¦ µ¹·ÁÁØ´Ù. Áï ´©±º°¡°¡ ÀÌ·¸°Ô ÀÔ·ÂÇß´Ù¸é
$ telnet whitehouse.gov
telnet Àº connect()¿¡ »ç¿ëÇϱâ À§Çؼ 198.137.240.100À̶ó´Â IPÁÖ¼Ò¸¦ ã¾Æ³»°Ô µÈ´Ù. ±×·±µ¥ ¾î¶»°Ô ±×·¸°Ô ÇÏ´Â °ÍÀΰ¡? gethostbyname()À» »ç¿ëÇÏ¸é µÈ´Ù.
#include <netdb.h> struct hostent *gethostbyname(const char *name);
º¸´Ù½ÃÇÇ °á°ú·Î struct hostentÀÇ Æ÷ÀÎÅÍ°¡ µ¹¾Æ¿Â´Ù. ±× ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.
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()Àº À§ÀÇ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°Ô µÇ¸ç ¿¡·¯ÀÇ °æ¿ì NULLÀ» µ¹·ÁÁØ´Ù. errno´Â ¼¼ÆõÇÁö ¾Ê°í h_errno°¡ ¼¼ÆÃÀÌ µÈ´Ù. (¾Æ·¡ÀÇ herror()ÂüÁ¶)
±×·±µ¥ ÀÌ°É ¾î¶»°Ô »ç¿ëÇϴ°¡? º¸Åë ÄÄÇ»ÅÍ ¸Å´º¾óµé ó·³ µ¶ÀÚ¾Õ¿¡ Á¤º¸¸¦ ¸¶±¸ ½×¾Æ³õÀº °Í¸¸À¸·Î´Â ºÎÁ·ÇÑ ¹ýÀÌ´Ù. ÀÌ ÇÔ¼ö´Â »ç½Ç º¸±âº¸´Ù´Â ¾²±â°¡ ½¬¿î ÆíÀÌ´Ù.
¿¹Á¦¸¦ º¸ÀÚ.
#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) { /* error check the command line */ fprintf(stderr,"usage: getip address\n"); exit(1); } if ((h=gethostbyname(argv[1])) == NULL) { /* get the host info */ 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; }
gethostbyname()¿¡¼´Â errno°¡ ¼¼ÆõÇÁö ¾Ê´Â ±î´ßÀ¸·Î perror()¸¦ »ç¿ëÇÒ ¼ö ¾ø°í herror()À» »ç¿ëÇØ¾ß ÇÑ´Ù.
°£´ÜÈ÷ È£½ºÆ®ÀÇ À̸§À» ´ã°í ÀÖ´Â ½ºÆ®¸µÀ» gethostbyname()ÇÔ¼ö¿¡ ³Ö¾î ÁÜÀ¸·Î½á ¹Ù·Î struct hostent ¸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù.
³²¾ÆÀÖ´Â ÇÑ°¡Áö ¼ö»óÇÑ Á¡Àº À§ÀÇ ¹æ¹ýÀ¸·Î ¾î¶»°Ô ÁÖ¼Ò¸¦ ¼ýÀÚ¿Í Á¡À¸·Î Ãâ·ÂÇÒ °ÍÀΰ¡ ÇÏ´Â ¹®Á¦ÀÌ´Ù. h->h_addr Àº ¹®ÀÚ Æ÷ÀÎÅÍ( char *) Àε¥ inet_ntoa()´Â º¯¼ö·Î¼ struct in_addr À» ¿øÇϱ⠶§¹®ÀÌ´Ù. µû¶ó¼ h->h_addr À» struct in_addr * À¸·Î Çüº¯È¯À» ÇÏ°í °á°ú°ªÀ» ¾ò±â À§ÇØ ´Ù½Ã ¿ªÂüÁ¶ ÇÏ¸é µÈ´Ù´Â °ÍÀÌ´Ù.
¿äÁòÀº Ŭ¶óÀ̾ðÆ®-¼¹ö°¡ ÆÇÄ¡´Â ¼¼»óÀÌÁÒ~~ ³×Æ®¿öÅ©¿¡ °üÇÑ ¸ðµç °ÍÀº ¼¹ö ÇÁ·Î¼¼½º¸¦ ¿äûÇϴ Ŭ¶óÀ̾ðÆ® ÇÁ·Î¼¼½º·Î¼ ´Ù·ç¾îÁø´Ù. ÅÚ³ÝÀ» ÀÌ¿ëÇÏ¿© 23¹ø Æ÷Æ®¿¡ Á¢¼ÓÇÏ´Â (Ŭ¶óÀ̾ðÆ®)°ÍÀº ¼¹öÇÁ·Î±×·¥(telnetd)À» ÀÛµ¿½ÃÅ°°Ô µÇ´Â °ÍÀ̸ç ÀÌ ¼¹ö ÇÁ·Î±×·¥Àº µé¾î¿À´Â °¢Á¾ ½ÅÈ£¸¦ ¹Þ¾Æµé¿©¼ ´ç½ÅÀÇ ÅÚ³Ý Á¢¼ÓÀ» À§ÇÏ¿© ·Î±×ÀÎ ÇÁ·ÒÇÁÆ®¸¦ ÁÖ°Ô µÇ´Â °ÍÀÌ´Ù. µîµî..
Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°£ÀÇ Á¤º¸ ±³È¯ÀÇ ¸ðµ¨ÀÌ ±×¸²¿¡ Àß ³ª¿ÍÀÖ´Ù.
ÁÖ¸ñÇÒÁ¡Àº Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°£¿¡´Â SOCK_STREAMÀ̵ç, SOCK_DGRAMÀ̵çÁö°£¿¡ °°Àº °ÍÀ¸·Î¸¸ µÈ´Ù¸é ÀÇ»ç¼ÒÅëÀÌ µÈ´Ù´Â °ÍÀÌ´Ù. ÁÁÀº ¿¹µéÀº telnet-telnetd, ftp-ftpd, ¶Ç´Â bootp-bootpd µîÀÌ´Ù. ftp¸¦ ¾´´Ù¸é ¹Ýµå½Ã »ó´ëÆí¿¡ ftpd°¡ µ¹°í ÀÖ´Ù´Â °ÍÀÌ´Ù.
º¸Åë È£½ºÆ®¿¡´Â ÇϳªÀÇ ¼¹ö ÇÁ·Î±×·¥ÀÌ µ¹°í ÀÖ°Ô µÈ´Ù. ±×¸®°í ±× ¼¹ö´Â fork()¸¦ ÀÌ¿ëÇÏ¿© ´ÙÁßÀÇ Å¬¶óÀ̾ðÆ®¸¦ ¹Þ°Ô µÇ´Â °ÍÀÌ´Ù. ±âº»ÀûÀÎ ·çƾÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù. ¼¹ö´Â Á¢¼ÓÀ» ´ë±âÇÏ´Ù°¡ accept()¸¦ È£ÃâÇÏ°Ô µÇ¸ç ±× ¶§ fork()¸¦ ÀÌ¿ëÇÏ¿© ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î³»¾î ±× Á¢¼ÓÀ» ó¸®ÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀÌ ¹Ù·Î ´ÙÀ½¿¡ ¼Ò°³µÉ ¿¹Á¦ ¼¹ö ÇÁ·Î±×·¥ÀÇ ±¸Á¶ÀÌ´Ù.
ÀÌ ¼¹ö°¡ ÇÏ´Â ÀÏÀº ¿ÀÁ÷ ½ºÆ®¸² Á¢¼ÓÀ» ÇÏ°Ô µÇ´Â ¸ðµç Ŭ¶óÀ̾ðÆ®¿¡°Ô "Hello, World!\n"À» Ãâ·ÂÇØ ÁÖ´Â °ÍÀÌ´Ù. ÀÌ ¼¹ö¸¦ Å×½ºÆ®Çϱâ À§Çؼ´Â ÇϳªÀÇ À©µµ¿ì¿¡¼ ÀÌ ¼¹ö¸¦ ½ÇÇà½ÃÄÑ ³õ°í ´Ù¸¥ À©µµ¿ì¿¡¼ ÅÚ³Ý Á¢¼ÓÀ» ½ÃµµÇØ º¸´Â °ÍÀÌ´Ù.
$ telnet remotehostname 3490
hostname Àº ¼¹ö ÇÁ·Î±×·¥ÀÌ ÀÛµ¿µÈ È£½ºÆ®ÀÇ À̸§ÀÌ´Ù.
¼¹ö ÇÁ·Î±×·¥ ÄÚµå
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define MYPORT 3490 /* the port users will be connecting to */ #define BACKLOG 10 /* how many pending connections queue will hold */ main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ &sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n", \ inet_ntoa(their_addr.sin_addr)); if (!fork()) { /* this is the child process */ if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ } }
ÀÌ ÄÚµå´Â ¹®¹ý»óÀÇ ´Ü¼øÇÔÀ» À§ÇÏ¿© ÇϳªÀÇ Ä¿´Ù¶õ(³» »ý°¢¿¡) main()¿¡ ¸ðµç °ÍÀÌ µé¾î°¡ ÀÖ´Ù. ¸¸¾à¿¡ ÀÌ°ÍÀ» Àß°Ô À߶ó¼ ÀÛÀº ¿©·¯°³ÀÇ ÇÔ¼ö·Î ±¸¼ºÀ» Çϴ°ÍÀÌ ÁÁ´Ù°í »ý°¢µÈ´Ù¸é ±×·¡µµ µÈ´Ù.
´ÙÀ½ÀÇ Å¬¶óÀ̾ðÆ® Äڵ带 ÀÌ¿ëÇÑ´Ù¸é ÀÌ ¼¹ö·ÎºÎÅÍ ¹®ÀÚ¿À» ¹Þ¾Æ ³¾¼öµµ ÀÖ´Ù.
À̳༮Àº ¼¹öº¸´Ù ´õ ½¬¿î ÄÚµåÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº ¸í·ÉÇà¿¡¼ ÁöÁ¤µÈ ÁÖ¼Ò¿¡ 3490¹ø Æ÷Æ®¿¡ Á¢¼ÓÇÏ¿© ¼¹ö°¡ º¸³»´Â ¹®ÀÚ¿À» ¹Þ´Â °Í »ÓÀÌ´Ù.
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3490 /* the port client will be connecting to */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; /* connector's address information */ if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ if (connect(sockfd, (struct sockaddr *)&their_addr, \ sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); close(sockfd); return 0; }
ÀÌ Å¬¶óÀ̾ðÆ®¸¦ ÀÛµ¿Çϱ⿡ ¾Õ¼¼ ¼¹ö¸¦ ÀÛµ¿½ÃÄѳõÁö ¾Ê¾Ò´Ù¸é connect()ÇÔ¼ö´Â "Connection refused"¸¦ µ¹·ÁÁÖ°Ô µÉ°ÍÀÌ´Ù. ¾µ¸¸Çϱº!
ÀÌ¿¡ °üÇؼ´Â ±×´ÙÁö ¾ê±âÇÒ °ÍÀÌ ¸¹Áö ¾Ê´Ù. µû¶ó¼ ±×³É µÎ°³ÀÇ ÇÁ·Î±×·¥À» º¸¿© ÁÖ°Ú´Ù.
listener´Â È£½ºÆ®¿¡ ¾É¾Æ¼ 4950Æ÷Æ®¿¡ µé¾î¿À´Â µ¥ÀÌÅÍ ÆÐŶÀ» ±â´Ù¸°´Ù. talker´Â ÁöÁ¤µÈ È£½ºÆ®ÀÇ ±× Æ÷Æ®·Î ¹¹µçÁö °£¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌÅ͸¦ º¸³½´Ù.
listener.c
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #define MYPORT 4950 /* the port users will be connecting to */ #define MAXBUFLEN 100 main() { int sockfd; struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int addr_len, numbytes; char buf[MAXBUFLEN]; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ == -1) { perror("bind"); exit(1); } addr_len = sizeof(struct sockaddr); if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \ (struct sockaddr *)&their_addr, &addr_len)) == -1) { perror("recvfrom"); exit(1); } printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr)); printf("packet is %d bytes long\n",numbytes); buf[numbytes] = '\0'; printf("packet contains \"%s\"\n",buf); close(sockfd); }
°á±¹ socket()¸¦ È£ÃâÇÒ ¶§ SOCK_DGRAMÀ» »ç¿ëÇÏ°Ô µÈ°ÍÀ» ÁÖÀÇÇÏ°í, listen()À̳ª accept()¸¦ »ç¿ëÇÏÁö ¾ÊÀº°Íµµ ÁÖÀÇÇØ ºÁ¾ß ÇÑ´Ù. ÀÌ Äڵ尡 ¹Ù·Î ºñ¿¬°á µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀÇ ÀÚ¶û½º·¯¿î »ç¿ë¿¹ÀÎ °ÍÀÌ´Ù.
talker.c
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <sys/socket.h> #include <sys/wait.h> #define MYPORT 4950 /* the port users will be connecting to */ int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in their_addr; /* connector's address information */ struct hostent *he; int numbytes; if (argc != 3) { fprintf(stderr,"usage: talker hostname message\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(MYPORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \ (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) { perror("sendto"); exit(1); } printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr)); close(sockfd); return 0; }
ÀÌ°ÍÀÌ ´Ù´Ù. listener¸¦ ÇÑ È£½ºÆ®¿¡¼ ½ÇÇà ½ÃÅ°°í ´Ù¸¥ °÷¿¡¼ talker¸¦ ½ÇÇà½ÃŲ´Ù. ÇÙ°¡Á·½Ã´ë¿¡ ¾î¿ï¸®´Â °¡Á·¿ë ¿À¶ôÀÌ µÉ¼öµµ...
¾Õ¿¡¼µµ ¾ê±âÇß¾úÁö¸¸ ÇÑ°¡Áö ÀÛÀº ³»¿ëÀ» ´õ ¸»ÇØ¾ß ÇÒ°Í °°´Ù. ¸¸¾à talker¿¡¼ connect()¸¦ È£ÃâÇؼ ¿¬°áÀ» Çß´Ù¸é ±× ´ÙÀ½ºÎÅÍ´Â sendto(), recvfrom()ÀÌ ¾Æ´Ï¶ó ±×³É send().recv()¸¦ »ç¿ëÇصµ µÈ´Ù´Â °ÍÀÌ´Ù. Àü´ÞµÇ¾î¾ß Çϴ ȣ½ºÆ®ÀÇ ÁÖ¼Ò´Â connect()¿¡ ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÇ°Ô µÈ´Ù.
ºí·ÎÅ·. ¾Æ¸¶ µé¾îºÃ°ÚÁö. ±×·±µ¥ µµ´ëü ±×°Ô ¹»±î? »ç½Ç "Àáµé´Ù"ÀÇ ±â¼ú¿ë¾î¿¡ ºÒ°úÇÑ °ÍÀÌ´Ù. ¾Æ¸¶µµ listener¸¦ ½ÇÇà½ÃÅ°¸é¼ ´«Ä¡¸¦ ë°ÚÁö¸¸ ±× ÇÁ·Î±×·¥Àº ±×Àú ¾É¾Æ¼ µ¥ÀÌÅÍ ÆÐŶÀÌ ¿Ã¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ´Ù. ÀáÀÚ¸é¼.. recvfrom()À» È£ÃâÇߴµ¥ µ¥ÀÌÅÍ°¡ µé¾î¿Â °ÍÀÌ ¾ø´Ù¸é? ¹Ù·Î ¹º°¡ µ¥ÀÌÅÍ°¡ µé¾î¿Ã ¶§±îÁö ºí·ÎÅ·ÀÌ µÇ´Â °ÍÀÌ´Ù(±×³É °Å±â¼ ÀÚ°í ÀÖ´Â °ÍÀÌ´Ù.).
¸¹Àº ÇÔ¼öµéÀÌ ºí·ÎÅ·ÀÌ µÈ´Ù. accept()´Â ºí·ÏÀÌ µÈ´Ù. recv*()Á¾·ùµéÀÌ ¸ðµÎ ºí·ÏÀÌ µÈ´Ù. ±×µéÀÌ ÀÌ·¸°Ô ÇÒ ¼ö ÀÖ´Â ÀÌÀ¯´Â ±×·¸°Ô ÇÒ ¼ö ÀÖµµ·Ï Çã¶ôÀ» ¹Þ¾Ò±â ¶§¹®ÀÌ´Ù. óÀ½¿¡ socket()À¸·Î ¼ÒÄÏÀÌ ¸¸µé¾îÁú¶§ Ä¿³ÎÀÌ ºí·Ï °¡´ÉÇϵµ·Ï ¼¼ÆÃÀ» Ç߱⠶§¹®ÀÌ´Ù. ¸¸ÀÏ ºí·ÏÇÒ¼ö ¾øµµ·Ï ¼¼ÆÃÇÏ·Á¸é fcntl()À» »ç¿ëÇÑ´Ù.
#include <unistd.h> #include <fcntl.h> . . sockfd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK); . .
¼ÒÄÏÀ» ºí·ÏÇÒ¼ö ¾øµµ·Ï ¼¼ÆÃÇÔÀ¸·Î½á Á¤º¸¸¦ ÃßÃâÇÏ´Â µ¥¿¡ È¿°úÀûÀ¸·Î socketÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ µ¥ÀÌÅÍ°¡ Á¢¼öµÇÁö ¾ÊÀº ¼ÒÄÏ¿¡¼ µ¥ÀÌÅ͸¦ ÀÐÀ¸·Á°í ½ÃµµÇÑ´Ù¸é -1À» °á°ú·Î µ¹·ÁÁÖ°í errno¸¦ EWOULDBLOCK À¸·Î ¼¼ÆÃÇÏ°Ô µÈ´Ù.
ÀϹÝÀûÀ¸·Î´Â ÀÌ·± ½ÄÀ¸·Î Á¤º¸¸¦ »Ì¾Æ ³»´Â °ÍÀº º°·Î ÁÁÀº ¹æ½ÄÀº ¾Æ´Ï´Ù. ¸¸ÀÏ µé¾î¿À´Â µ¥ÀÌÅ͸¦ °¨½ÃÇϱâ À§ÇÏ¿© ÀÌ·± ¹æ½ÄÀ¸·Î ¹Ù»Ú°Ô µ¥ÀÌÅ͸¦ ã´Â ·çƾÀ» ¸¸µç´Ù¸é ÀÌ´Â CPU ½Ã°£À» ¼Ò¸ðÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. ±¸½ÄÀÌ´Ù. º¸´Ù ¸ÚÁø ¹æ¹ýÀº ´ÙÀ½Àý¿¡ ³ª¿À´Â select()¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±â´Ù¸®´Â ½ÄÀÌ´Ù.
ÀÌ°Ç ¹º°¡ Á» ÀÌ»óÇÑ ÇÔ¼öÀÌ´Ù. ±×·¯³ª »ó´çÈ÷ À¯¿ëÇϹǷΠÀß Àо±â ¹Ù¶õ´Ù. ´ÙÀ½ »óȲÀ» °¡Á¤ÇØ º¸ÀÚ. Áö±Ý ¼¹ö¸¦ µ¹¸®°í ÀÖÀ¸¸ç ÀÌ¹Ì ¿¬°áµÈ ¼ÒÄÏ¿¡¼ µ¥ÀÌÅÍ°¡ µé¾î¿À´Â °ÍÀ» ±â´Ù¸®°í ÀÖ´Ù°í ÇÏÀÚ.
¹®Á¦¾øÁö, ±×³É accept()ÇÏ°í recv()¸î°³¸é µÉÅÙµ¥.. ¼µÑÁö ¸»Áö¾î´Ù, Ä£±¸. ¸¸ÀÏ accept()¿¡¼ ºí·ÎÅ·ÀÌ µÈ´Ù¸é? µ¿½Ã¿¡ ¾î¶»°Ô recv()¸¦ ¾µ °ÍÀΰ¡? ºí·ÎÅ· ¸øÇÏ°Ô ¼¼ÆÃÇÑ´Ù°í? CPU½Ã°£À» ³¶ºñÇÏÁö ¸»¶ó´Ï±î. ±×·¯¸é ¾î¶»°Ô?
´õÀÌ»ó ¶°µéÁö ¸»°í ´ÙÀ½À» º¸¿©ÁÖ°Ú´Ù.
#include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
ÀÌ ÇÔ¼ö´Â ÈÀÏ ±â¼úÀÚÀÇ "ÁýÇÕ", Ưº°È÷ readfds,writefds,exceptfdsµîÀ» °ü¸®ÇÑ´Ù. ¸¸ÀÏ ÀϹÝÀûÀÎ ÀÔ·ÂÀ̳ª ¼ÒÄÏ ±â¼úÀڷκÎÅÍ ÀÐ¾î µéÀϼö Àִ°¡¸¦ È®ÀÎÇÏ·Á¸é ´ÜÁö ÈÀÏ ±â¼úÀÚ 0°ú sockfd¸¦ readfds¿¡ ´õÇØÁֱ⸸ ÇÏ¸é µÈ´Ù. numfds´Â °¡Àå ³ôÀº ÆÄÀÏ ±â¼úÀÚ¿¡´Ù°¡ 1À» ´õÇؼ ÁöÁ¤ÇØ¾ß Çϸç À̹ø ¿¹Á¦¿¡¼´Â Á¤±Ô ÀÔ·ÂÀÇ 0º¸´Ù È®½ÇÈ÷ Å©°Ô Çϱâ À§Çؼ sockfd+1 À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
select()ÀÇ °á°ú°ªÀÌ ³ª¿Ã¶§ readfs´Â ¼±ÅÃÇÑ ÆÄÀÏ ±â¼úÀÚ Áß¿¡ ¾î¶² °ÍÀÌ Àб⠰¡´ÉÇÑ°¡¸¦ ¹Ý¿µÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤µÇ¸ç FD_ISSET() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© üũÇÒ ¼ö ÀÖ´Ù.
³Ê¹« ¸Ö¸® ³ª°¡±â Àü¿¡ ÀÌ "ÁýÇÕ"µéÀ» ¾î¶»°Ô °ü¸®ÇÏ´Â °¡¿¡ ´ëÇؼ ¾ê±â¸¦ ÇØ¾ß ÇÒ°Í °°´Ù. °¢°¢ÀÇ "ÁýÇÕ"Àº fd_setÇüÀÌ¸ç ´ÙÀ½ÀÇ ¸ÅÅ©·Îµé·Î À̸¦ Á¦¾îÇÒ ¼ö ÀÖ´Ù.
³¡À¸·Î ÀÌ ¼ö»óÇÑ struct timevalÀº ¶Ç ¹«¾ùÀΰ¡? ¾Æ¸¶µµ ´©±º°¡°¡ ¾î¶² µ¥ÀÌÅ͸¦ º¸³»´Â °ÍÀ» ¹«ÇÑÁ¤ ±â´Ù¸®±â¸¦ ¿øÄ¡´Â ¾ÊÀ» °ÍÀÌ´Ù. ƯÁ¤½Ã°£¸¶´Ù ¾Æ¹«Àϵµ ¾È ¹ú¾îÁö´õ¶óµµ "ÇöÀç ÁøÇàÁß..."À̶ó´Â ¸Þ½ÃÁö¸¦ Å͹̳ο¡ Ãâ·Â½ÃÅ°±â¶óµµ ¿øÇÒ °ÍÀÌ´Ù. ÀÌ ±¸Á¶Ã¼´Â ±× ½Ã°£°£°ÝÀ» Á¤ÀÇÇϱâ À§Çؼ »ç¿ëµÇ´Â °ÍÀÌ´Ù. ÀÌ ½Ã°£ÀÌ ÃÊ°úµÇ°í ±× ¶§±îÁö select()°¡ ¾Æ¹«·± º¯È¸¦ °¨ÁöÇÏÁö ¸øÇÑ °æ¿ì¶ó¸é °á°ú¸¦ µ¹·ÁÁÖ°í ´ÙÀ½ ÀÛ¾÷À» ÁøÇà ÇÒ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
struct timevalÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
struct timeval { int tv_sec; /* seconds */ int tv_usec; /* microseconds */ };
±â´Ù¸± ½Ã°£ÀÇ Ãʸ¦ ÁöÁ¤ÇÏ·Á¸é ±×³É tv_sec¿¡ ÁöÁ¤ÇÏ¸é µÈ´Ù. tv_usec¿¡´Â ¸¶ÀÌÅ©·Î Ãʸ¦ ÁöÁ¤ÇÑ´Ù. ¹Ð¸®ÃÊ°¡ ¾Æ´Ï°í ¸¶ÀÌÅ©·ÎÃÊÀÌ´Ù. ¸¶ÀÌÅ©·ÎÃÊ´Â ¹é¸¸ºÐÀÇ ÀÏÃÊÀÌ´Ù. ±×·±µ¥ ¿Ö usecÀΰ¡? u´Â ±×¸®½º ¹®ÀÚÀÇ Mu¸¦ ´à¾Ò°í ÀÌ´Â ¸¶ÀÌÅ©·Î¸¦ ÀǹÌÇϴµ¥ »ç¿ëµÈ´Ù. ÇÔ¼ö°¡ ³¡³¯¶§ timeout¿¡ ³²Àº ½Ã°£ÀÌ ±â·ÏµÉ¼öµµ ÀÖÀ¸¸ç ÀÌ ³»¿ëÀº À¯´Ð½º¸¶´Ù ´Ù¸£±â´Â ÇÏ´Ù.
¿Í¿ì~ ¸¶ÀÌÅ©·Î ÃÊ ´ÜÀ§ÀÇ Å¸À̸Ӹ¦ °¡Áö°Ô µÇ¾ú±º! ¸¸ÀÏ timeval¿¡ ÇʵåµéÀ» 0À¸·Î ä¿ì¸é select()´Â Áï½Ã °á°ú¸¦ µ¹·ÁÁÖ¸ç ÇöÀç setµéÀÇ ³»¿ëÀ» Áï½Ã ¾Ë·ÁÁÖ°Ô µÈ´Ù. timeoutÀ» NULL·Î ¼¼ÆÃÇÏ¸é °áÄÚ ³¡³ªÁö ¾Ê°í °è¼Ó ÆÄÀÏ ±â¼úÀÚ°¡ ÁغñµÇ´Â °ÍÀ» ±â´Ù¸®°Ô µÇ¸ç ³¡À¸·Î ƯÁ¤ÇÑ set¿¡ º¯È¿¡ °ü½ÉÀÌ ¾ø´Ù¸é ±× Ç׸ñÀ» NULL·Î ÁöÁ¤ÇÏ¸é µÈ´Ù.
´ÙÀ½Àº Á¤±Ô ÀԷ¿¡ ¹«¾ð°¡ ³ªÅ¸³¯¶§±îÁö 2.5Ãʸ¦ ±â´Ù¸®´Â ÄÚµåÀÌ´Ù.
#include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 /* file descriptor for standard input */ main() { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); /* don't care about writefds and exceptfds: */ select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); }
¸¸ÀÏ ÇÑÁÙ¾¿ ¹öÆÛ¸µÇÏ´Â Å͹̳ÎÀ̶ó¸é ¿£ÅÍÅ°¸¦ Ä¡Áö ¾Ê´Â ÀÌ»óÀº ±×³É ŸÀӾƿô¿¡ °É¸±°ÍÀÌ´Ù.
ÀÌÁ¦ ¾Æ¸¶µµ ÀÌ ÈǸ¢ÇÑ ¹æ¹ýÀ» µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡¼ µ¥ÀÌÅ͸¦ ±â´Ù¸®´Â µ¥¿¡ »ç¿ëÇÒ¼ö ÀÖÀ¸¸®¶ó°í »ý°¢ÇÒ °ÍÀÌ´Ù. ¸Â´Ù. ±×·² ¼öµµ ÀÖ´Ù. ¾î¶² À¯´Ð½º¿¡¼´Â ÀÌ ¹æ¹ýÀÌ µÇÁö¸¸ ¾ÈµÇ´Â °Íµµ ÀÖ´Ù. ÇÏ°íÀÚ ÇÏ´Â ³»¿ë¿¡ ´ëÇؼ´Â ¾Æ¸¶µµ ¸ÇÆäÀÌÁö¸¦ ÂüÁ¶ÇØ¾ß ÇÒ °ÍÀÌ´Ù.
select()¿¡ °üÇÑ ¸¶Áö¸· ¾ê±â´Â listen()ÀÌ µÈ ¼ÒÄÏÀÌ ÀÖ´Ù¸é ÀÌ ¹æ¹ýÀ» ÀÌ¿ëÇÏ¿© ¼ÒÄÏ ±â¼úÀÚ¸¦ readfds¿¡ ÷°¡ÇÏ´Â ¹æ½ÄÀ¸·Î »õ·Î¿î ¿¬°áÀÌ ÀÖ¾ú´Â°¡¸¦ È®ÀÎÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù.
ÀÌ°ÍÀÌ select()¿¡ ´ëÇÑ ÂªÀº °ËÅä¿´´Ù.
¿©±â±îÁö ¿Í¼´Â ¾Æ¸¶ Á»´õ »õ·Î¿î ´Ù¸¥ °ÍÀº ¾ø´Â°¡ ÇÒ°ÍÀÌ´Ù. ¶Ç ¾îµð¼ ´Ù¸¥ ¹«¾ð°¡¸¦ ´õ ãÀ»¼ö Àִ°¡¸¦ ¾Ë°íÀÚ ÇÒ°ÍÀÌ´Ù.
Ãʺ¸ÀÚ¶ó¸é ´ÙÀ½ÀÇ ¸ÇÆäÀÌÁö¸¦ Âü°íÇÏ´Â °Íµµ ÁÁ´Ù.
ÀÌ»óÀÌ ÀüºÎÀÌ¸ç ¹®¼»ó¿¡¼ Å©°Ô Ʋ¸° °÷ÀÌ ¾ø±â¸¸À» ¹Ù¶ö »ÓÀÌ´Ù. ÇÏÁö¸¸ ½Ç¼ö´Â Ç×»ó ÀÖ´Â ¹ýÀÌ´Ù.
¸¸¾à ½Ç¼ö°¡ ÀÖ´Ù¸é ºÎÁ¤È®ÇÑ Á¤º¸¸¦ ÁÖ¾î Çò°¥¸®°Ô ¸¸µí°Í¿¡ ´ëÇÏ¿© »ç°úÇÏÁö¸¸ »ç½Ç»ó ³ªÇÑÅ× Ã¥ÀÓÀ» ¹°À»¼ö´Â ¾ø´Ù. ÀÌ ¾ê±â´Â ¹ýÀûÀÎ °æ°íÀÌ¸ç »ç½Ç»ó ÀÌ ¸ðµç ±ÛµéÀÌ ¸ù¶¥ °ÅÁþ¸» Àϼöµµ ÀÖ´Â °ÍÀÌ´Ù.
±×·¡µµ ¼³¸¶ ±×·¸Áö´Â ¾ÊÀ» °ÍÀÌ´Ù. »ç½Ç ³ ÀÌ ¸ðµç°Íµé ¶§¹®¿¡ »ó´çÈ÷ ¸¹Àº ½Ã°£À» ¼Ò¸ðÇß°í À©µµ¿ì¿ë TCP/IP³×Æ®¿öÅ© À¯Æ¿¸®Æ¼(¿¹¸¦ µé¾î Åڳݵî)À» ¹æÇм÷Á¦·Î Çß¾ú´Ù. ³ ¼ÒÄÏÀÇ ½ÅÀÌ ¾Æ´Ï¶ó ±×³É º¸Åë »ç¶÷ÀÏ »ÓÀÌ´Ù.
±×°Ç ±×·¸°í »ý»êÀûÀÎ (ȤÀº Æı«ÀûÀ̶óµµ) ºñÆòÀÌ ÀÖ´Â ºÐÀº beej@ecst.csuchico.edu ¾ÕÀ¸·Î ¸ÞÀÏÀ» Áֱ⠹ٶõ´Ù. Âü°íÇÏ¿© °íÃijª°¡µµ·Ï ³ë·ÂÀ» ÇØ º¸°Ú´Ù.
¿Ö ÀÌ ÀÏÀ» Çߴ°¡ ±Ã±ÝÇÏ´Ù¸é, µ·¹ú·Á°í Çß´Ù. ÇÏÇÏ~ »ç½ÇÀº ¾Æ´Ï°í ¸¹Àº »ç¶÷µéÀÌ ¼ÒÄÏ¿¡ °ü·ÃµÈ Áú¹®À» ÇØ ´ë´Â ¹Ù¶÷¿¡ ±×µé¿¡°Ô ÀÌ ³»¿ëÀ» À¥¿¡ ¿Ã¸®·Á°í »ý°¢ÁßÀ̶ó°í ¸»Çß´õ´Ï "¹Ù·Î ±×°Å¾ß~"¶ó°íµé Çؼ ½è´Ù. ¾Æ¹«¸® °í»ýÇؼ ¾òÀº Á¤º¸¶óµµ ¸¸ÀÏ ´Ù¸¥ »ç¶÷°ú °øÀ¯ÇÏÁö ¾Ê´Â´Ù¸é ¾²·¹±âÀÏ »ÓÀ̶ó°í »ý°¢ÇÑ´Ù. WWW´Â ¹Ù·Î Àû´çÇÑ ¼ö´ÜÀÌ µÈ °Í »ÓÀÌ´Ù. ´Ù¸¥ »ç¶÷µµ ÀÌ·± Á¤º¸ÀÇ Á¦°øÀÌ °¡´ÉÇÏ´Ù¸é ÀÌ·¸°Ô ÇØÁÖ±æ ¹Ù¶õ´Ù.
³¡³µ´Ù. ÇÁ·Î±×·¥À̳ª Â¥·¯°¡ÀÚ. ;-)
¹ø¿ªÇÑ »ç¶÷ÀÇ ¸»: ¿ì¿¬È÷ ÀÌ ±ÛÀ» ¹ß°ßÇÏ°Ô µÇ¾î ¹ø¿ªÀ» ÇÏ°í º¸´Ï ³ª¸§´ë·Î °¡Ä¡°¡ ÀÖ¾î º¸¿©¼ ȨÆäÀÌÁö¿¡ ¿Ã·Á ³õ¾Ò½À´Ï´Ù. ¹ø¿ª»óÀÇ ½Ç¼ö°¡ ÀÖ¾ú´Ù¸é »ç°úµå¸®¸ç ÁöÀûÇØ ÁÖ½Å´Ù¸é °íÃÄ ³ª°¡°Ú½À´Ï´Ù. ÁÁÀº ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥¿¡ ÀÌ ±ÛÀÌ ÀÛÀ¸³ª¸¶ µµ¿òÀÌ µÇ±æ ¹Ù¶ø´Ï´Ù.