BeeJ's Guide to Network Programming.

ÀÎÅÍ³Ý ¼ÒÄÏ È°¿ë(v.1.5.4, 17-May-1998)

http://www.ecst.csuchico.edu/~beej/guide/net ¹ø¿ª : ¹Ú¼ºÈ£(tempter@fourthline.com),1998/8/20

½ÃÀÛ

¼ÒÄÏ ÇÁ·Î±×·¥ÀÌ ¾î·Æ³ª¿ä? ±×³É ¸ÇÆäÀÌÁö¸¸ º¸°í¼­´Â ¾Ë¾Æ³»±â°¡ Á» ¾î·´³ª¿ä? ¹º°¡ À־ÀÌ´Â ÀÎÅÍ³Ý ÇÁ·Î±×·¥À» ¸¸µé°í ½ÍÁö¸¸ 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ÀÌ ¾î¶»°Ô ±¸¼ºµÇ´Â Áö¸¦ ¾Ë¾Æº¼ ÇÊ¿ä°¡ ÀÖÀ» °Í°°´Ù. »ç½Ç ÀÌ ÀýÀº ±×³É ³Ñ¾î°¡µµ µÈ´Ù.

[Encapsulated Protocols Image] ¿©·¯ºÐ~ ÀÌÁ¦´Â µ¥ÀÌŸ ĸ½¶È­¿¡ ´ëÇÏ¿© ¹è¿ì°Ú¾î¿ä~ »ç½Ç ÀÌ°ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù. ¾ó¸¶³ª Áß¿äÇÏ³Ä¸é ¿ì¸® Çб³¿¡¼­ ³×Æ®¿öÅ© ÄÚ½º¸¦ Åë°úÇÏ·Á¸é ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÏ´Â »çÇ×À̱⠶§¹®ÀÌ´Ù. (Èì..) ³»¿ëÀº ÀÌ·¸´Ù. µ¥ÀÌÅÍ ÆÐŶÀÌ ¸¸µé¾îÁö¸é ¸ÕÀú ù¹ø° ÇÁ·ÎÅäÄÝ(tftp ÇÁ·ÎÅäÄÝ)¿¡ ÇÊ¿äÇÑ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ºÙ´Â´Ù. ÀÌ·¸°Ô Çѹø ĸ½¶È­µÈ ³»¿ëÀº ´Ù½Ã µÎ¹ø° ÇÁ·ÎÅäÄÝ(UDP)¿¡ °ü·ÃµÈ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ´Ù½Ã ºÙ°Ô µÈ´Ù. ±× ´ÙÀ½¿¡´Â IP, ±× ´ÙÀ½¿¡´Â ¸¶Áö¸·À¸·Î Çϵå¿þ¾î ÀûÀÎ °èÃþÀ¸·Î¼­ ÀÌ´õ³Ý ÇÁ·ÎÅäÄݷΠĸ½¶È­°¡ µÇ´Â °ÍÀÌ´Ù.

´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ ÀÌ ÆÐŶÀ» ¹Þ°Ô µÇ¸é Çϵå¿þ¾î°¡ ÀÌ´õ³Ý Çì´õ¸¦ Ç®°í Ä¿³Î¿¡¼­ IP¿Í UDP Çì´õ¸¦ Ç®°í tftp ÇÁ·Î±×·¥¿¡¼­ tftpÇì´õ¸¦ Ç®°í ÇÏ¿© ³¡À¸·Î ¿ø·¡ÀÇ µ¥ÀÌÅ͸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù.

ÀÌÁ¦ µåµð¾î ¾Ç¸í³ôÀº °èÃþÀû ³×Æ®¿öÅ© ¸ðµ¨(Layered Network Model)À» ¾ê±âÇÒ ¶§°¡ µÈ°Í °°´Ù. ÀÌ ¸ðµ¨Àº ´Ù¸¥ ¸ðµ¨µé¿¡ ºñÇؼ­ ³×Æ®¿öÅ©ÀÇ ½Ã½ºÅÛÀ» ±â¼úÇÏ´Â Ãø¸é¿¡¼­ ¸¹Àº ÀÌÁ¡ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¸é ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ì ´õ ³·Àº °èÃþ¿¡¼­ ¾î¶² ¹°¸®ÀûÀÎ ¹æ½Ä(½Ã¸®¾óÀÎÁö thin ethernetÀÎÁö ¶Ç´Â AUI¹æ½ÄÀÎÁö)À¸·Î Àü´ÞµÇ´Â Áö¿¡ ´ëÇÏ¿© ÀüÇô ½Å°æÀ» ¾²Áö ¾Ê°íµµ ÀÛ¾÷ÀÌ °¡´ÉÇØ Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ½ÇÁ¦ ³×Æ®¿öÅ© Àåºñ³ª ÅäÆú·ÎÁö´Â ¼ÒÄÏ ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ÀüÇô °ü°è¾ø´Â ºÐ¾ßÀÌ´Ù.

´õÀÌ»ó ¶°µéÁö ¾Ê°í ´ÙÀ½ °èÃþµéÀ» ÀÏ·¯ Áִµ¥ ¸¸ÀÏ ³×Æ®¿öÅ© ÄÚ½º¿¡¼­ ½ÃÇèÀ» º¸°Ô µÉ °æ¿ì¶ó¸é ¿Ü¿ì´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.

¹°¸®Àû °èÃþ(Physical layer)´Â Çϵå¿þ¾î(½Ã¸®¾ó, ÀÌ´õ³Ýµî) ÀÌ´Ù. ¾îÇø®ÄÉÀÌ¼Ç °èÃþÀº »ó»óÇÒ ¼ö ÀÖµíÀÌ ¹°¸®Àû °èÃþÀÇ ¹Ý´ëÆí ³¡ÀÌ´Ù. ÀÌ °èÃþÀ» ÅëÇÏ¿© »ç¿ëÀÚ´Â ³×Æ®¿öÅ©¿Í Á¢ÃËÇÏ°Ô µÇ´Â °ÍÀÌ´Ù.

»ç½Ç ÀÌ ¸ðµ¨Àº ÀÚµ¿Â÷ ¼ö¸® ¼³¸í¼­ ó·³ ½ÇÁúÀûÀÎ ¹º°¡¸¦ ÇÒ ¼ö Àֱ⿡´Â ³Ê¹«³ª ÀϹÝÀûÀÎ ¾ê±âÀÌ´Ù. À¯´Ð½ºÀÇ °æ¿ì¸¦ µé¾î º¸´Ù ½ÇÁúÀûÀÎ ¾ê±â¸¦ ÇØ º»´Ù¸é,

ÀÌ·¯ÇÑ °èÃþÀ¸·Î »ìÆì º»´Ù¸é ¾Æ±îÀÇ µ¥ÀÌÅÍ Ä¸½¶È­°¡ °¢°¢ ¾î¶² °èÃþ¿¡ ¼ÓÇÏ´Â °¡¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÌ·¸°Ô ¸¹Àº ÀÛ¾÷ÀÌ ÇϳªÀÇ µ¥ÀÌÅÍ ÆÐŶÀ» ¸¸µå´Âµ¥ µ¿¿øµÇ´Â °ÍÀÌ´Ù. ÀÌ ³»¿ëÀ» ´ç½ÅÀÌ µ¥ÀÌÅÍÀÇ ÆÐŶ ¸Ó¸®ºÎºÐ¿¡ ¸ù¶¥ ŸÀÌÇÎ ÇØ ³Ö¾î¾ß ÇÑ´Ù´Â ¾ê±â´Ù. (¹°·Ð ³ó´ãÀÌ´Ù.) ½ºÆ®¸² ¼ÒÄÏÀÇ °æ¿ì µ¥ÀÌÅ͸¦ ³»º¸³»±â À§ÇØ ÇØ¾ß ÇÒ ÀÏÀº ¿ÀÁ÷ send()¸¦ È£ÃâÇÏ´Â °Í »ÓÀÌ´Ù. µ¥ÀÌÅÍ ±×·¥ÀÇ °æ¿ì¿¡´Â ¿øÇÏ´Â ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ Çѹø ĸ½¶È­ÇÏ°í (tftp¹æ½Äµî) sendto()·Î º¸³»¹ö¸®¸é µÇ´Â °ÍÀÌ´Ù.Ä¿³ÎÀÌ Àü¼Û°èÃþ°ú ÀÎÅÍ³Ý °èÃþ¿¡ °ü·ÃµÈ ĸ½¶È­¸¦ ÇÏ°í ³ª¸ÓÁö´Â Çϵå¿þ¾î°¡ ÇÑ´Ù. ¾Æ~ ÷´Ü ±â¼ú!!

ÀÌ°ÍÀ¸·Î °£´ÜÇÑ ³×Æ®¿öÅ© ÀÌ·ÐÀº ³¡ÀÌ´Ù. Âü, ¶ó¿ìÆÿ¡ °üÇؼ­ ÇÏ°í ½Í´ø ¾ê±âµéÀ» Çϳªµµ ¾ÈÇß´Ù. Èì, Çϳªµµ ¾ø´Ù. Á¤¸»ÀÌÁö ¶ó¿ìÆÿ¡ °üÇؼ­ Çϳªµµ ¾ê±âÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¶ó¿ìÅÍ°¡ IPÇì´õ¸¦ ¹þ°Ü³»¼­ ¶ó¿ìÆà Å×À̺íÀ» ÂüÁ¶ÇÏ¿© ¾î¼±¸ Àú¼±¸...¸¸ÀÏ Á¤¸»·Î ¿©±â¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é IP RFC¸¦ ÂüÁ¶ÇÒ °ÍÀÌ¸ç ¸¸¾à °Å±â¿¡ ´ëÇؼ­ Çϳªµµ ¾ËÁö ¸øÇÑ´Ù¸é! »ý¸í¿¡ ÁöÀåÀº ¾ø´Ù.


struct S

°á±¹Àº ¿©±â±îÁö ¿Ô±º. µåµð¾î ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ¾ê±â¸¦ ÇÒ ¶§ÀÌ´Ù. ÀÌ Àý¿¡¼­´Â ½ÇÁ¦·Î ²Ï³ª ÀÌÇØÇϱ⠾î·Á¿î ¼ÒÄÏ ÀÎÅÍÆäÀ̽º¿¡¼­ ¾²ÀÌ´Â ¿©·¯°¡Áö µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇÑ ¾ê±â¸¦ ÇÒ ¿¹Á¤ÀÌ´Ù.

¸ÕÀú ½¬¿î°Í. ¼ÒÄÏ ±â¼úÀÚÀÌ´Ù.¼ÒÄÏ ±â¼úÀÚÀÇ µ¥ÀÌÅÍ ÇüÀº

	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ÁÖ¼Ò´Â ¹«¾ùÀÌ¸ç ¾î¶»°Ô ´Ù·ç´Â°¡?

´ÙÇེ·´°Ôµµ 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() ; ÆÄÀÏ ±â¼úÀÚ¸¦ Àâ¾Æ¶ó

¾ÈÇÏ¸é ¸ÂÀ»°Í °°¾Æ¼­ 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()ÀÇ ¸ÇÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)


bind() ; ³ª´Â ¾î¶² Æ÷Æ®¿¡ ¿¬°áµÇ¾ú³ª?

ÀÏ´Ü ¼ÒÄÏÀ» ¿­°Ô µÇ¸é ÀÌ ¼ÒÄÏÀ» ÇöÀç ½Ã½ºÅÛÀÇ Æ÷Æ®¿¡ ¿¬°á½ÃÄÑ ÁÖ¾î¾ß ÇÑ´Ù. (ÀÌ ÀÛ¾÷Àº º¸Åë 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¸¦ ÇØÁØ´Ù.


connect() ; ¾îÀÌ~ °Å±â~

ÀÌÁ¦ Àá±ñ¸¸ ¸¶Ä¡ ÀÚ½ÅÀÌ ÅÚ³Ý ÇÁ·Î±×·¥ÀÎ °Íó·³ »ý°¢ÇØ º¸±â·Î ÇÏÀÚ. ´ç½ÅÀÇ »ç¿ëÀÚ´Â ¸í·ÉÇϱ⸦ (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() ; ´©°¡ ÀüÈ­Á» °É¾îÁÖÁö~

ÀÌÁ¦ º¸Á¶¸¦ ¹Ù²Ù¾î¼­, ¸¸¾à¿¡ ¾îµð·Ð°¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÜºÎ·ÎºÎÅÍÀÇ Á¢¼ÓÀ» ´ë±âÇؼ­ Á¢¼ÓÀÌ ¿Ã °æ¿ì ¾î¶² ¹æ½ÄÀ¸·ÎµçÁö °£¿¡ 󸮸¦ ÇØ ÁÖ¾î¾ß ÇÏ´Â °æ¿ì¶ó¸é ¾îÂî ÇÒ °ÍÀΰ¡. ÀÌ ÀÛ¾÷Àº µÎ ´Ü°è·Î ÀÌ·ç¾îÁø´Ù. ¸ÕÀú 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() ; Æ÷Æ® 3490¿¡ ÀüÈ­°É¾îÁּż­ °¨»çÇÕ´Ï´Ù.

Áغñ! 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¸¦ ¸·¾Æ ¹ö¸± ¼öµµ ÀÖ´Ù.


send(), recv() ; ¸»Á»ÇغÁ~

ÀÌ µÎ ÇÔ¼ö´Â ½ºÆ®¸² ¼ÒÄÏÀ̳ª ¿¬°áµÈ µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ§¿¡¼­ Á¤º¸¸¦ ÁÖ°í ¹ÞÀ»¶§ »ç¿ëÇÏ´Â °ÍµéÀÌ´Ù. ¸¸¾à º¸ÅëÀÇ ºñ¿¬°á µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù¸é 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¸¦ ¼¼ÆÃÇÑ´Ù.

½¬¿üÀ»±î? ½¬¿üÁö.. ÀÌÁ¦ ´ç½ÅÀº ½ºÆ®¸² ¼ÒÄÏÀ» ÀÌ¿ëÇؼ­ µ¥ÀÌÅ͸¦ º¸³»°í ¹ÞÀ» ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿ì¿Í~ À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¸Ó³×~~


sendto(), recvfrom() ; ¸»Á»ÇغÁ~ µ¥ÀÌÅÍ ±×·¥ ¹æ½Ä

±¦ÂúÀº°É, À̶ó°í ¸»ÇÏ°í ÀÖ´ÂÁÙ·Î »ý°¢ÇÏ°Ú´Ù. ±×·±µ¥ µ¥ÀÌÅͱ׷¥¿¡ °üÇÑ ³ª¸ÓÁö´Â ¾îµøÁö? ³ëÇÁ¶óºí·¹¸ð~ ¾Æ¹Ì°í~(¿ªÀÚ: Å͹̳×ÀÌÅÍ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(), shutdown() ; ²¨Áö¼î.

ÈÞ~~ ÇÏ·çÁ¾ÀÏ µ¥ÀÌÅ͸¦ º¸³»°í ¹Þ¾Ò´õ´Ï..ÀÌÁ¦´Â ¼ÒÄÏÀ» ´ÝÀ» ¶§°¡ µÈ °ÍÀÌ´Ù. ÀÌ°Ç ½±´Ù. Á¤±Ô ÆÄÀÏ ±â¼úÀÚ¿¡ °üÇÑ close()¸¦ »ç¿ëÇÏ¸é µÇ´Â °ÍÀÌ´Ù.

    close(sockfd);

ÀÌ°ÍÀ¸·Î ´õÀÌ»óÀÇ ÀÔÃâ·ÂÀº ºÒ°¡´É ÇØÁö¸ç ´©±¸µçÁö ¿ø°ÝÁö¿¡¼­ ÀÌ ¼ÒÄÏ¿¡ ÀÐ°í ¾²·Á°í ÇÏ´Â ÀÚ´Â ¿¡·¯¸¦ ¹Þ°Ô µÉ °ÍÀÌ´Ù.

¾à°£ ´õ ¼¼¹ÐÇÑ Á¦¾î¸¦ À§Çؼ­´Â shutdown()À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ°ÍÀ» ÀÌ¿ëÇϸé ƯÁ¤¹æÇâÀ¸·ÎÀÇ Åë½Å¸¸À» ²÷À» ¼öµµ ÀÖ°Ô µÈ´Ù.

    int shutdown(int sockfd, int how);

sockfd´Â ¼ÒÄÏ ±â¼úÀÚÀ̸ç how´Â ´ÙÀ½°ú °°´Ù.

shutdown() Àº ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.

Ȳ¼ÛÇÏ¿É°Ôµµ ¿¬°áµµ µÇÁö¾ÊÀº µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡ shutdown()À» »ç¿ëÇÑ´Ù¸é ´ÜÁö send(), recv()¸¦ »ç¿ëÇÏÁö ¸øÇÏ°Ô¸¸ ¸¸µé °ÍÀÌ´Ù. connect()¸¦ »ç¿ëÇÑ °æ¿ì¿¡¸¸ ÀÌ·¸°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. (¿ªÀÚ: ±×·¸´Ù¸é sendto, recvfromÀº »ç¿ëÀÌ µÈ´Ù´Â ¾ê±âÀΰ¡??Å×½ºÆ®°¡ ÇÊ¿äÇÒµí.)

¾Ï°Íµµ ¾Æ´Ï±º.


getpeername() ; ´©±¸½Ê´Ï±î?

ÀÌ ÇÔ¼ö´Â µÇ°Ô ½±´Ù.

³Ê¹« ½¬¿ö¼­ ÀýÀ» µû·Î ¸¸µé ÇÊ¿ä°¡ ¾øÁö¾Ê³ª °í¹ÎÇßÁö¸¸ ¿©±â ÀÖ´Â°É º¸´Ï±î..

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À» ÂüÁ¶Ç϶ó°í ¸»ÇÏ°í ½Í´Ù.)


gethostname() ; ³­ ´©±¸Àΰ¡?

getpeername()º¸´Ù ´õ ½¬¿î °ÍÀÌ ÀÌ ÇÔ¼öÀÌ´Ù. °á°ú·Î ÇÁ·Î±×·¥ÀÌ µ¹°í ÀÖ´Â ÄÄÇ»ÅÍÀÇ À̸§À» ¾Ë·ÁÁØ´Ù. À̸§Àº gethostbyname()À» ÀÌ¿ëÇÏ¿© ·ÎÄà ÀåºñÀÇ IPÁÖ¼Ò¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëµÉ ¼öµµ ÀÖ´Ù.

¹¹°¡ ´õ Àç¹ÌÀִ°¡? ¸î°¡Áö »ý°¢ÇØ º¼ ¼ö Àִµ¥ ÀÌ ¹®¼­¿¡´Â ÀûÀýÇÏÁö ¾ÊÀº ³»¿ëÀÌ´Ù(¿ªÀÚ: °ú¿¬ ¹»±î..µÇ°Ô ±Ã±ÝÇϳ×..). ¾î·°Å³ª,

    #include <unistd.h>

    int gethostname(char *hostname, size_t size);

hostnameÀº ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍÀ̸ç ÇÔ¼ö°¡ µ¹·ÁÁÖ´Â °ªÀ» ´ã°Ô µÉ º¯¼öÀÌ´Ù. size´Â ±× ¹®ÀÚ¿­ÀÇ Å©±âÀÌ´Ù.

¼º°øÀûÀ̸é 0À», ¿¡·¯ÀÇ °æ¿ì -1À» ¸®ÅÏÇÏ°í errno¸¦ ¼¼ÆÃÇÑ´Ù.


DNS ; whitehouse.gov - 198.137.240.100

¸ð¸£´Â »ç¶÷À» À§ÇÏ¿© 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)À» ÀÛµ¿½ÃÅ°°Ô µÇ´Â °ÍÀ̸ç ÀÌ ¼­¹ö ÇÁ·Î±×·¥Àº µé¾î¿À´Â °¢Á¾ ½ÅÈ£¸¦ ¹Þ¾Æµé¿©¼­ ´ç½ÅÀÇ ÅÚ³Ý Á¢¼ÓÀ» À§ÇÏ¿© ·Î±×ÀÎ ÇÁ·ÒÇÁÆ®¸¦ ÁÖ°Ô µÇ´Â °ÍÀÌ´Ù. µîµî..

[Client-Server Relationship] ±×¸²2. Ŭ¶óÀ̾ðÆ®-¼­¹ö°£ÀÇ °ü°è

Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ÀÇ Á¤º¸ ±³È¯ÀÇ ¸ðµ¨ÀÌ ±×¸²¿¡ Àß ³ª¿ÍÀÖ´Ù.

ÁÖ¸ñÇÒÁ¡Àº Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£¿¡´Â 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()¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±â´Ù¸®´Â ½ÄÀÌ´Ù.


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()¿¡ ´ëÇÑ ÂªÀº °ËÅä¿´´Ù.

Âü°í»çÇ×

¿©±â±îÁö ¿Í¼­´Â ¾Æ¸¶ Á»´õ »õ·Î¿î ´Ù¸¥ °ÍÀº ¾ø´Â°¡ ÇÒ°ÍÀÌ´Ù. ¶Ç ¾îµð¼­ ´Ù¸¥ ¹«¾ð°¡¸¦ ´õ ãÀ»¼ö Àִ°¡¸¦ ¾Ë°íÀÚ ÇÒ°ÍÀÌ´Ù.

Ãʺ¸ÀÚ¶ó¸é ´ÙÀ½ÀÇ ¸ÇÆäÀÌÁö¸¦ Âü°íÇÏ´Â °Íµµ ÁÁ´Ù.

´ÙÀ½ Ã¥µéµµ µµ¿òÀÌ µÉ°ÍÀÌ´Ù. books:
Internetworking with TCP/IP, volumes I-III
by Douglas E. Comer and David L. Stevens.
Published by Prentice Hall.
Second edition ISBNs: 0-13-468505-9, 0-13-472242-6, 0-13-474222-2.
There is a third edition of this set which covers IPv6 and IP over ATM.

Using C on the UNIX System
by David A. Curry.
Published by O'Reilly & Associates, Inc.
ISBN 0-937175-23-4.

TCP/IP Network Administration
by Craig Hunt.
Published by O'Reilly & Associates, Inc.
ISBN 0-937175-82-X.

TCP/IP Illustrated, volumes 1-3
by W. Richard Stevens and Gary R. Wright.
Published by Addison Wesley.
ISBNs: 0-201-63346-9, 0-201-63354-X, 0-201-63495-3.

Unix Network Programming
by W. Richard Stevens.
Published by Prentice Hall.
ISBN 0-13-949876-1.

À¥»ó¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖÀ»°ÍÀÌ´Ù.
BSD Sockets: A Quick And Dirty Primer (http://www.cs.umn.edu/~bentlema/unix/--has other great Unix system programming info, too!)

Client-Server Computing (http://pandonia.canberra.edu.au/ClientServer/socket.html)

Intro to TCP/IP (gopher) (gopher://gopher-chem.ucdavis.edu/11/Index/Internet_aw/Intro_the_Internet/intro.to.ip/)

Internet Protocol Frequently Asked Questions (France) (http://web.cnam.fr/Network/TCP-IP/)

The Unix Socket FAQ (http://www.ibrado.com/sock-faq/)

²ûÂïÇÏÁö¸¸..RFCµµ ºÁ¾ß ÇÏ°Ú´Ù.
RFC-768 -- The User Datagram Protocol (UDP) (ftp://nic.ddn.mil/rfc/rfc768.txt)

RFC-791 -- The Internet Protocol (IP) (ftp://nic.ddn.mil/rfc/rfc791.txt)

RFC-793 -- The Transmission Control Protocol (TCP) (ftp://nic.ddn.mil/rfc/rfc793.txt)

RFC-854 -- The Telnet Protocol (ftp://nic.ddn.mil/rfc/rfc854.txt)

RFC-951 -- The Bootstrap Protocol (BOOTP) (ftp://nic.ddn.mil/rfc/rfc951.txt)

RFC-1350 -- The Trivial File Transfer Protocol (TFTP) (ftp://nic.ddn.mil/rfc/rfc1350.txt)


ÁÖÀÇ»çÇ× ¹× ¿¬¶ôó

ÀÌ»óÀÌ ÀüºÎÀÌ¸ç ¹®¼­»ó¿¡¼­ Å©°Ô Ʋ¸° °÷ÀÌ ¾ø±â¸¸À» ¹Ù¶ö »ÓÀÌ´Ù. ÇÏÁö¸¸ ½Ç¼ö´Â Ç×»ó ÀÖ´Â ¹ýÀÌ´Ù.

¸¸¾à ½Ç¼ö°¡ ÀÖ´Ù¸é ºÎÁ¤È®ÇÑ Á¤º¸¸¦ ÁÖ¾î Çò°¥¸®°Ô ¸¸µí°Í¿¡ ´ëÇÏ¿© »ç°úÇÏÁö¸¸ »ç½Ç»ó ³ªÇÑÅ× Ã¥ÀÓÀ» ¹°À»¼ö´Â ¾ø´Ù. ÀÌ ¾ê±â´Â ¹ýÀûÀÎ °æ°íÀÌ¸ç »ç½Ç»ó ÀÌ ¸ðµç ±ÛµéÀÌ ¸ù¶¥ °ÅÁþ¸» Àϼöµµ ÀÖ´Â °ÍÀÌ´Ù.

±×·¡µµ ¼³¸¶ ±×·¸Áö´Â ¾ÊÀ» °ÍÀÌ´Ù. »ç½Ç ³­ ÀÌ ¸ðµç°Íµé ¶§¹®¿¡ »ó´çÈ÷ ¸¹Àº ½Ã°£À» ¼Ò¸ðÇß°í À©µµ¿ì¿ë TCP/IP³×Æ®¿öÅ© À¯Æ¿¸®Æ¼(¿¹¸¦ µé¾î Åڳݵî)À» ¹æÇм÷Á¦·Î Çß¾ú´Ù. ³­ ¼ÒÄÏÀÇ ½ÅÀÌ ¾Æ´Ï¶ó ±×³É º¸Åë »ç¶÷ÀÏ »ÓÀÌ´Ù.

±×°Ç ±×·¸°í »ý»êÀûÀÎ (ȤÀº Æı«ÀûÀ̶óµµ) ºñÆòÀÌ ÀÖ´Â ºÐÀº beej@ecst.csuchico.edu ¾ÕÀ¸·Î ¸ÞÀÏÀ» Áֱ⠹ٶõ´Ù. Âü°íÇÏ¿© °íÃijª°¡µµ·Ï ³ë·ÂÀ» ÇØ º¸°Ú´Ù.

¿Ö ÀÌ ÀÏÀ» Çߴ°¡ ±Ã±ÝÇÏ´Ù¸é, µ·¹ú·Á°í Çß´Ù. ÇÏÇÏ~ »ç½ÇÀº ¾Æ´Ï°í ¸¹Àº »ç¶÷µéÀÌ ¼ÒÄÏ¿¡ °ü·ÃµÈ Áú¹®À» ÇØ ´ë´Â ¹Ù¶÷¿¡ ±×µé¿¡°Ô ÀÌ ³»¿ëÀ» À¥¿¡ ¿Ã¸®·Á°í »ý°¢ÁßÀ̶ó°í ¸»Çß´õ´Ï "¹Ù·Î ±×°Å¾ß~"¶ó°íµé Çؼ­ ½è´Ù. ¾Æ¹«¸® °í»ýÇؼ­ ¾òÀº Á¤º¸¶óµµ ¸¸ÀÏ ´Ù¸¥ »ç¶÷°ú °øÀ¯ÇÏÁö ¾Ê´Â´Ù¸é ¾²·¹±âÀÏ »ÓÀ̶ó°í »ý°¢ÇÑ´Ù. WWW´Â ¹Ù·Î Àû´çÇÑ ¼ö´ÜÀÌ µÈ °Í »ÓÀÌ´Ù. ´Ù¸¥ »ç¶÷µµ ÀÌ·± Á¤º¸ÀÇ Á¦°øÀÌ °¡´ÉÇÏ´Ù¸é ÀÌ·¸°Ô ÇØÁÖ±æ ¹Ù¶õ´Ù.

³¡³µ´Ù. ÇÁ·Î±×·¥À̳ª Â¥·¯°¡ÀÚ. ;-)

¹ø¿ªÇÑ »ç¶÷ÀÇ ¸»: ¿ì¿¬È÷ ÀÌ ±ÛÀ» ¹ß°ßÇÏ°Ô µÇ¾î ¹ø¿ªÀ» ÇÏ°í º¸´Ï ³ª¸§´ë·Î °¡Ä¡°¡ ÀÖ¾î º¸¿©¼­ ȨÆäÀÌÁö¿¡ ¿Ã·Á ³õ¾Ò½À´Ï´Ù. ¹ø¿ª»óÀÇ ½Ç¼ö°¡ ÀÖ¾ú´Ù¸é »ç°úµå¸®¸ç ÁöÀûÇØ ÁÖ½Å´Ù¸é °íÃÄ ³ª°¡°Ú½À´Ï´Ù. ÁÁÀº ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥¿¡ ÀÌ ±ÛÀÌ ÀÛÀ¸³ª¸¶ µµ¿òÀÌ µÇ±æ ¹Ù¶ø´Ï´Ù.


Copyright © 1995, 1996 by Brian "Beej" Hall. This guide may be reprinted in any medium provided that its content is not altered, it is presented in its entirety, and this copyright notice remains intact. Contact beej@ecst.csuchico.edu for more information. ÁÁÀº ³»¿ëÀÇ ±ÛÀ»ÀÛ¼ºÇÏ°í ÇѱÛÆÇ ¹ø¿ªÀ» Çã¶ôÇØÁØ ¿øÀÛÀÚ¿¡°Ô °¨»çÇÏ¸ç ¹ø¿ªÀڷμ­ÀÇ ¸ðµç±Ç¸®´Â ÀоîÁֽŠºÐµé²² µå¸®°Ú½À´Ï´Ù. ¹ø¿ª»óÀÇ ½Ç¼ö³ª »ý»êÀûÀÎ ÁöÀûÀº tempter@fourthline.com À¸·Î º¸³»ÁÖ½Ã¸é µÇ°Ú½À´Ï´Ù. °¨»çÇÕ´Ï´Ù.