11. ¼ÒÄÏ
ÀÌ Àå¿¡¼´Â ¼ÒÄÏÀ» »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º°£ÀÇ Åë½Å¿¡ °üÇÑ GNUÀåÄ¡¿¡ ´ëÇØ ¼¼úÇÑ´Ù.
¼ÒÄÏÀº ÀϹÝÀûÀÎ ÇÁ·Î¼¼½º°£ÀÇ Åë½Å ä³ÎÀÌ´Ù. ÆÄÀÌÇÁó·³ ¼ÒÄÏÀº ÆÄÀÏ ¼¼úÀÚó·³ Ç¥ÇöµÈ´Ù. ±×·¯ ³ª ÆÄÀÌÇÁ¿Í´Â ´Þ¸® ¼ÒÄÏÀº °ü·Ã ¾ø´Â ÇÁ·Î¼¼½º °£ÀÇ Åë½Å,³×Æ®¿öÅ©¸¦ ÅëÇÏ¿© ¼·Î ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ¼öÇàµÇ°í ÀÖ´Â ÇÁ·Î¼¼½º°£ÀÇ Åë½ÅÀ» Á¦°øÇÑ´Ù. ¼ÒÄÏÀº ÁÖ·Î ´Ù¸¥ ÄÄÇ»ÅͰ£ÀÇ Åë½ÅÀÇ ¼ö´ÜÀÌ´Ù. ; telnet, rlogin, ftp, talk, ±×¸®°í ³×Æ®¿öÅ© ÇÁ·Î±×·¥µéÀº ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù. ¸ðµç ¿î¿µÃ¼Á¦°¡ ¼ÒÄÏÀ» Áö¿øÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. GNU¶óÀ̺귯¸®¿¡¼ 'sys/socket.h' Àº ¿î¿µÃ¼Á¦¿Í »ó°ü¾øÀÌ Á¸ÀçÇÑ´Ù. ±×·¯³ª ¸¸¾à ½Ã½ºÅÛÀÌ ¼ÒÄÏÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é, ¼ÒÄÏÇÔ¼ö´Â Ç×»ó ½ÇÆÐÇÑ´Ù.
¹Ì¿Ï¼º: ¿ì¸®´Â ÇöÀç ÀÎÅÍ³Ý ÀÎÅÍÆäÀ̽º ¼³Á¤À̳ª ºê·Îµåij½ºÆ® ¸Þ½ÃÁö ±â´É¿¡ °üÇÏ¿©´Â ¹®¼ÈÇÏ Áö ¸øÇß´Ù.
11.1 ¼ÒÄÏ °³³ä
´ç½ÅÀÌ ¼ÒÄÏÀ» ¸¸µé¶§, ¹Ýµå½Ã ´ç½ÅÀÌ ¾î¶² Åë½Å ½ºÅ¸ÀÏÀ» ¾µ °ÍÀÎÁö, ¾î¶² ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ °ÍÀÎ Áö ¸í½ÃÇØ¾ß ÇÑ´Ù. ¼ÒÄÏÀÇ Åë½Å ½ºÅ¸ÀÏÀº ¼ÒÄÏÀ¸·Î µ¥ÀÌÅ͸¦ º¸³»°í ¹Þ´Â À¯Àú·¹º§ ±¸¹®À» Á¤ÀÇÇÑ ´Ù. Åë½Å ½ºÅ¸ÀÏÀ» ¼±ÅÃÇÏ´Â °ÍÀº ´ÙÀ½°ú °°Àº Áú¹®ÀÇ ÀÀ´äÀÌ µÈ´Ù.
o µ¥ÀÌÅÍ Àü¼ÛÀÇ ´ÜÀ§´Â ¹«¾ùÀΰ¡?
¾î¶² Åë½Å ½ºÅ¸ÀÏÀº Å« ±¸Á¶Ã¼¸¦ °¡ÁöÁö ¾Ê´Â, ¹ÙÀÌÆ®ÀÇ ¿·Î µÈ´Ù. ; ´Ù¸¥ °ÍµéÀº (ÆÐŶ°°Àº) ·¹ÄÚ µå ¾È¿¡ ¹ÙÀÌÆ®¸¦ ¹¾î ³õ´Â´Ù.
o º¸Åë ÀÛ¾÷À» ÇÏ´Â µ¿¾È¿¡ µ¥ÀÌÅ͸¦ ÀÒ¾î ¹ö¸±¼ö ÀÖ³ª?
¾î¶² Åë½Å ½ºÅ¸ ÀÏ¿¡¼ º¸³»Áø µ¥ÀÌÅͰ¡ (½Ã½ºÅÛÀ̳ª ³×Æ®¿öÅ© Ãæµ¹À» Á¦¿ÜÇϰí) º¸³»Áø ¼ø¼´ë·Î ¸ðµÎ µµ´ÞÇØ¾ß ÇÑ´Ù. ; ´Ù¸¥ ½ºÅ¸ÀÏÀº ¶§·Î´Â º¸Åë µ¿À۽ÿ¡µµ µ¥ÀÌÅ͸¦ ÀÒ¾î ¹ö¸®°Å³ª, Çϳª ÀÌ»ó ÀÇ °°Àº ÆÐŶÀÌ Àü´ÞµÉ¼öµµ ÀÖ°í, ¼ø¼°¡ µÚ¹Ù²ð¼öµµ ÀÖ´Ù.
½Å·ÚÀÖ´Â Åë½Å½ºÅ¸ÀÏÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥À» ¼³°èÇÏ´Â °ÍÀº º¸Åë µ¥ÀÌÅÍ ¼Õ½ÇÀ̳ª, ¼ø¼°¡ µÚ¹Ù ²î´Â °ÍÀ» °ËÃâÇϰí Çʿ信 µû¶ó ÀçÀü¼ÛÇÏ´Â ´ëÃ¥À» Æ÷ÇÔÇÑ´Ù.
o »ó´ëÃø°ú ¿ÏÀüÇÑ Åë½ÅÀ» ÇÏ´À³Ä?
¾î¶² Åë½Å½ºÅ¸ÀÏÀº ÀüÈ °Å´Â °Í¿Í °°ÀÌ »ó´ëÃø°ú ¿ø°Ý ¼ÒÄÏ ¿¬°áÀ» ¸¸µé°í³ª¼, ÀÚÀ¯·Ó°Ô µ¥ÀÌ Å͸¦ ±³È¯ÇÑ´Ù.; ´Ù¸¥ ½ºÅ¸ÀÏÀº ÆíÁö ¾²´Â °Íó·³ ´ç½ÅÀÌ º¸³»°íÀÚÇÏ´Â ¸Þ½ÃÁöÀÇ ÁÖ¼Ò¸¦ ½á¼ º¸³½ ´Ù.
´ç½ÅÀº ¶ÇÇÑ ¼ÒÄÏÀÇ À̸§°ø°£¿¡¼ À̸§À» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ¼ÒÄÏÀ̸§("ÁÖ¼Ò")´Â ƯÁ¤ÇÑ À̸§°ø°£ÀÇ ÀÇ ¹Ì½ÉÀåÇÑ ³»¿ëÀÌ ÀÖ´Ù. À̸§°ø°£Àº ¶ÇÇÑ "µµ¸ÞÀÎ"À̶ó°í ºÒ¸°´Ù. ±×·¯³ª, ¿ì¸®´Â °°Àº ¿ë¾îÀÇ ´Ù¸¥ »ç¿ë°ú È¥µ·ÇÒ ¼ö ÀÖ¾î ±× ¸»À» ÇÇÇϰڴÙ. °¢ À̸§°ø°£Àº 'PF_'·Î ½ÃÀÛÇÏ´Â »ó¡ÀûÀÎ À̸§À» °¡ Áø´Ù. 'AF_'·Î ½ÃÀÛÇÏ´Â À¯»çÇÑ »óÁ÷Àû À̸§Àº ±× À̸§°ø°£¿¡ ÁÖ¼Ò Æ÷¸ËÀ» °¡¸®Å²´Ù.
¸¶Áö¸·À¸·Î, ´ç½ÅÀº Åë½ÅÀ» Á¦°øÇÏ´Â ÇÁ·ÎÅäÄÝÀ» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ÇÁ·ÎÅäÄÝÀº µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â µ¥ »ç¿ëµÇ´Â Àú¼öÁØ ¸ÞÄ«´ÏÁòÀ» ¸»ÇÑ´Ù. °¢ ÇÁ·ÎÅäÄÝÀº ƯÁ¤ÇÑ À̸§°ø°£°ú Åë½Å½ºÅ¸ÀÏ¿¡ ´ëÇÏ¿© À¯È¿ÇÏ´Ù.; À̸§°ø°£Àº Á¾Á¾ ÇÁ·ÎÅäÄÝ ÆÐ¹Ð¸®¶ó°í ºÒ¸®¿î´Ù. ¿Ö³ÄÇϸé À̸§ °ø°£ÀÌ 'PF_'·Î ½ÃÀÛ
Çϱ⠶§¹®ÀÌ´Ù.
ÇÁ·ÎÅäÄÝÀÇ ±ÔÄ¢Àº ºñ·Ï ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼ ÀÏÁö¶óµµ µÎ ÇÁ·Î±×·¥°£ÀÇ µ¥ÀÌÅÍ Àü¼ÛÀ» Á¦°øÇÑ´Ù. ÀÌ·¯ ÇÑ ±ÔÄ¢ÀÇ ´ëºÎºÐÀº ¿î¿µÃ¼Á¦¿¡ ÀÇÇÏ¿© ´Ù·ç¾îÁö°í, ´ç½ÅÀÌ ±×°Í¿¡ ´ëÇØ ¾Ë ÇÊ¿ä´Â ¾ø´Ù. ´ç½ÅÀÌ ÇÁ ·ÎÅäÄÝ¿¡ ´ëÇÏ¿© ¾Ë¾Æ¾ß ÇÒ °ÍÀº À̰ÍÀÌ´Ù.:
o µÎ ¼ÒÄϰ£ÀÇ Åë½ÅÀ» À§ÇÏ¿©, ±×°ÍµéÀº ¹Ýµå½Ã °°Àº ÇÁ·ÎÅäÄÝÀ» ³ªÅ¸³»¾ß ÇÑ´Ù.
o °¢ ÇÁ·ÎÅäÄÝÀº ƯÁ¤ÇÑ ½ºÅ¸Àϰú À̸§°ø°£ °áÇÕ¿¡ Àǹ̸¦ °¡Áö¸ç, Àû´çÇÏÁö ¾ÊÀº °áÇÕÀÇ »ç¿ëÀº ÇÒ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î TCP ÇÁ·ÎÅäÄÝÀº ¹ÙÀÌÆ® ½ºÆ®¸² ½ºÅ¸ÀÏÀÇ Åë½Å°ú ÀÎÅÍ³Ý À̸§°ø°£¿¡ ¸ÂÃß¾îÁ® ÀÖ´Ù.
o ½ºÅ¸Àϰú À̸§°ø°£ÀÇ °¢ Á¶ÇÕ¿¡¼ ÇÁ·ÎÅäÄÝ ¹øÈ£¸¦ 0À¸·Î ³ªÅ¸³»¾î ¿ä±¸ÇÏ¸é ±×°ÍÀº ±âº»ÇÁ·ÎÅä ÄÝ(µðÆúÆ® ÇÁ·ÎÅäÄÝ)·Î µÈ´Ù. ±×¸®°í, ´ç½ÅÀº º¸Åë ÇÏ´Â °Í(µðÆúÆ®¸¦ »ç¿ëÇÏ´Â °Í)ÀÌ ÀÌ·± °ÍÀÌ´Ù.
11.2 Åë½Å½ºÅ¸ÀÏ
GNU¶óÀ̺귯¸®´Â °¢±â ´Ù¸¥ Ư¼ºÀ» Áö´Ñ ¸î Á¾·ùÀÇ ¼ÒÄÏÀ» Áö¿øÇϰí ÀÖ´Ù. ÀÌ Àý¿¡¼´Â Áö¿øµÇ ´Â ¼ÒÄÏ ÇüŸ¦ ¼¼úÇÑ´Ù. ¿©±â ³ªÅ¸³ ½Éº¼¸¯ »ó¼ö´Â 'sys/socket.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
int SOCK_STREAM Macro
SOCK_STREM½ºÅ¸ÀÏÀº ÆÄÀÌÇÁ¿Í °°´Ù. (10Àå[ÆÄÀÌÇÁ¿Í FIFO]À» º¸¶ó, 145ÆäÀÌÁö); ±×°ÍÀº ƯÁ¤ÇÑ ¿ø°Ý ¼ÒÄϰúÀÇ ¿¬°áÈÄ¿¡ µ¿ÀÛÇÑ´Ù. ±×¸®°í ¹ÙÀÌÆ®ÀÇ ½ºÆ®¸²Ã³·³ ½Å·Ú¼º ÀÖ´Â µ¥ÀÌÅÍ Àü¼ÛÀ» ÇÑ´Ù. ÀÌ ½ºÅ¸ÀÏÀÇ »ç¿ëÀº 11.8Àý[¿¬°á 166ÆäÀÌÁö]¿¡ ÀÚ¼¼È÷ ³ª¿Í ÀÖ´Ù.
int SOCK__DGRAM Macro
SOCK_DGRAM ½ºÅ¸ÀÏÀº °³º°ÀûÀ¸·Î ÁÖ¼Ò°¡ ¾²¿©Áø ÆÐŶÀ» Àü´ÞÇϴµ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº SOCK_STREAM°ú Á¤¹Ý´ëÀÌ´Ù. ´ç½ÅÀÌ ÀÌ Á¾·ùÀÇ ¼ÒÄÏ¿¡ µ¥ÀÌÅ͸¦ ½á³Ö´Â´Ù. ±×·¯¸é ±× µ¥ÀÌÅÍ´Â ÇϳªÀÇ ÆÐŶÀÌ µÈ´Ù. SOCK_DGRAM ¼ÒÄÏÀº ¿¬°áÀ» °¡ÁöÁö ¾Ê´Â´Ù. ´ç½ÅÀº °¢ ÆÐŶ¿¡ ¹Ýµå½Ã ¹Ýº¹ ÀûÀ¸·Î ÁÖ¼Ò¸¦ ½á³Ö¾î¾ß ÇÑ´Ù. µ¥ÀÌÅ͸¦ Àü¼ÛÇϰíÀÚ ÇÏ´Â ´ç½ÅÀÇ ¿ä±¸¿¡ °üÇÏ¿© ½Ã½ºÅÛÀÇ Ã¥ÀÓÀº,
°¢ ÆÐŶÀÌ °¡Àå Àß ¹è´ÞµÉ ¼ö ÀÖµµ·Ï ½ÃµµÇÏ´Â °ÍÀÌ´Ù. ±×°ÍÀº ³× ¹øÂ°¿Í ´Ù¼¸ ¹øÂ° ½ÇÆÐ ÈÄ¿¡ ¿©¼¸ ¹øÂ°¿¡ ¼º°øÇÒ ¼ö ÀÖ´Ù.; Àϰö ¹øÂ° ÆÐŶÀº ¿©¼¸ ¹øÂ° Àü¿¡ µµÂøµÉ ¼öµµ ÀÖ´Ù. ±×¸®°í ¿©¼¸ ¹øÂ° ÈÄ ¿¡ µÎ ¹ø µµÂøÇÒ ¼öµµ ÀÖ´Ù. SOCK_DGRAMÀº ÀϹÝÀûÀ¸·Î ÀÀ´äÇØ¾ßÇÒ ½Ã°£³»¿¡ ÀÀ´äÀÌ ¾øÀ»¶§ °£´ÜÈ÷ ÆÐŶÀ» ÀçÀü¼ÛÇϴµ¥ ÀûÇÕÇÏ´Ù. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â 11.9 Àý[µ¥ÀÌÅͱ׷¥],176ÂÊÀ» º¸¶ó
int SOCK__RAW Macro
ÀÌ ½ºÅ¸ÀÏÀº Àú¼öÁØ ³×Æ®¿öÅ© ÇÁ·ÎÅäÄݰú ÀÎÅÍÆäÀ̽º¸¦ ¾ï¼¼½ºÇϵµ·Ï
ÇØ ÁØ´Ù. º¸Åë »ç¿ëÀÚ ÇÁ·Î±× ·¥Àº ÀÌ ½ºÅ¸ÀÏÀ» ÀÚÁÖ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù.
11.3 ¼ÒÄÏ ÁÖ¼Ò
¼ÒÄÏÀÇ À̸§Àº º¸Åë "ÁÖ¼Ò"¶ó°í ºÒ¸®¿î´Ù. ¼ÒÄÏÁÖ¼Ò¿Í °ü°èµÈ ±âÈ£(symbol)¿Í ÇÔ¼öµéÀº, ¶§ ¶§·Î "À̸§"À̶ó´Â ¸»À̳ª "ÁÖ¼Ò"¸¦ »ç¿ëµÇ¾î, ¾î¶² ±ÔÄ¢ ¾øÀÌ À̸§ Áö¾îÁø´Ù. ´ç½ÅÀº ¼ÒÄÏÀÌ °í·Á µÇ´Â °÷¿¡ ÀÌ·¯ÇÑ ¸»À» µ¿ÀÏÇÑ °Íó·³ »ý°¢ÇÒ ¼ö ÀÖ´Ù. socketÇÔ¼ö·Î »õ·Ó°Ô ¸¸µç ¼ÒÄÏÀº ÁÖ¼Ò¸¦ °¡ÁöÁö ¾Ê´Â´Ù. ´ç½ÅÀÌ ±×°Í¿¡°Ô ÁÖ¼Ò¸¦ ÁÖ¾î¾ß¸¸, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Åë½ÅÀ» À§ÇÑ ÁÖ¼Ò¸¦ ãÀ»¼ö ÀÖ °Ô µÈ´Ù. À̰ÍÀ» ÁÖ¼Ò¸¦ ¼ÒÄÏ¿¡ ¹´Â´Ù°í Çϰí, bindÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. ¸¸¾à ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ÁÖ¼Ò À» ã°í, ÁÖ¼Ò¸¦ ÀÌ¿ëÇÏ¿© Åë½ÅÀ» ½ÃÀÛÇÏ´Â °ÍÀ̶ó¸é, ´ç½ÅÀº ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ »ý°¢ÇØ º¼ Çʿ䰡 ÇÑ ´Ù. ´ç½ÅÀº ´Ù¸¥ ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ ±Ô¸íÇÒ ¼ö ÀÖÁö¸¸, ±×°ÍÀº º¸Åë ¹«ÀǹÌÇÏ´Ù; óÀ½, ¼ÒÄÏÀ¸·ÎºÎÅÍ µ¥ ÀÌÅ͸¦ º¸³»°Å³ª ¿¬°áÀ» ÃʱâÈÇϱâ À§ÇØ ±×°ÍÀ» »ç¿ëÇÒ ¶§, ¸¸¾à ±¸Ã¼ÀûÀ¸·Î ³ªÅ¸³»Áø °ÍÀÌ ¾ø´Ù ¸é, ½Ã½ºÅÛÀº ÁÖ¼Ò¸¦ ÀÚµ¿À¸·Î ¼³Á¤ÇÑ´Ù.
¼¹ö´Â ÁÖ¼Ò¿¡ ±âÃÊÇÏ¿© ÆÇº¯µÇ±â ¶§¹®¿¡, º¸Åë Ŭ¶óÀÌ¾ðÆ®´Â ÁÖ¼Ò¸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù.; ¿¹¸¦ µé ¾î, rsh¿Í rlogin ÇÁ·ÎÅäÄÝÀº Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò¸¦ »ìÇǰí, ¸¸¾à ±×°ÍÀÌ IPPORT_RESERVEDº¸ ´Ù ÀÛÁö ¾Ê´Ù¸é, ¾ÏÈ£°Ë»ç¸¦ °ÅÃÄ¾ß ÇÑ´Ù. (11.5.3ÀýÀÇ [Æ÷Æ®],159ÂÊÀ» º¸¶ó)
¼ÒÄÏÁÖ¼ÒÀÇ ÀÚ¼¼ÇÑ °ÍÀº ´ç½ÅÀÌ »ç¿ëÇÏ´Â ¾î¶² À̸§°ø°£¿¡ ÀÇÁ¸ÇÏ¿© º¯ÇÑ´Ù. ÀÚ¼¼ÇÑ Á¤º¸¸¦ À§ ÇØ¼´Â 11.4Àý [ÆÄÀÏ À̸§°ø°£] (153ÂÊ)À» º¸°Å³ª, 11.5Àý [ÀÎÅÍ³Ý À̸§°ø°£] (155ÂÊ)À» º¸¶ó. À̸§°ø °£¿¡ »ó°ü¾øÀÌ , ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ ¼¼Æ®ÇÏ°í »ç¿ëÇϱâ À§ÇØ ´ç½ÅÀº °°Àº bind¿Í getsocknameÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµéÀº ÁÖ¼Ò¸¦ ¹Þ¾ÆµéÀ̱â À§ÇØ struct sockaddr *¶ó´Â À§Á¶ ÀÚ·áÇü(phony data type)À» »ç¿ëÇÑ´Ù. ½ÇÁ¦ÀûÀ¸·Î, ÁÖ¼Ò´Â ´ç½ÅÀÌ »ç¿ëÇÏ´Â ÁÖ¼ÒÆ÷¸Ë°ú´Â ´Ù¸¥ ÀÚ·áÇüÀÇ ±¸Á¶·Î µÇ¾î ÀÖ ´Ù. ±×·¯³ª, ´ç½ÅÀº ±×°ÍÀ» bindÇϱâ À§ÇØ ³Ñ°ÜÁÙ ¶§, ±×°ÍÀÇ ÁÖ¼Ò¸¦ struct sockaddr *·Î ÀÚ·áÇüº¯È¯ (cast)À» ÇØÁÖ¾î¾ß ÇÑ´Ù.
11.3.1 ÁÖ¼Ò Æ÷¸Ë
bind¿Í getsocknameÇÔ¼ö´Â ¼ÒÄÏÀÇ ÁÖ¼ÒÀÇ Æ÷ÀÎÅ͸¦ ÀǹÌÇÏ´Â struct sockaddr *À̶ó´Â ÀÏ¹Ý ÀûÀÎ ÀÚ·áÇüÀ» »ç¿ëÇÑ´Ù. ´ç½ÅÀº ÁÖ¼Ò¸¦ ¹ø¿ªÇϰųª ¸¸µé±â À§ÇØ ÀÌ ÀÚ·áÇüÀ» È¿À²ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ¾ø´Ù; ´ë½Å, ¼ÒÄÏÀÇ À̸§°ø°£À» À§ÇÑ ÀÚ·áÇüÀ» »ç¿ëÇØ¾ß¸¸ ÇÑ´Ù. ±×·¯¹Ç·Î, º¸Åë ½ÇÁ¦ÀûÀÎ »ç¿ëÀº Àû ÇÕÇÑ À̸§°ø°£ÀÇ ÇüÅÂÀÇ ÁÖ¼Ò¸¦ ¸¸µå´Âµ¥ »ç¿ëÇÏ°í³ª¼, bind³ª getsocknameÀ» È£ÃâÇÒ ¶§ struct sockaddr *·Î Æ÷ÀÎÅÍÇüŸ¦ º¯È¯ÇÑ´Ù. ´ç½ÅÀÌ struct sockaddr ÀÚ·áÇüÀ¸·ÎºÎÅÍ ¾òÀ» ¼ö ÀÖ´Â Á¤º¸ Áß Çϳª´Â, ÁÖ¼Ò¸¦ ¿ÏÀüÈ÷ ÀÌÇØÇϱâ À§ÇØ »ç¿ëµÇ´Â ÀÚ·áÇüÀÌ ¾î¶² °ÍÀÎÁö ¾Ë·ÁÁÖ´Â "ÁÖ¼Ò Æ÷¸Ë" ÁöÁ¤ÀÚÀÌ´Ù. ÀÌ Àý¿¡¼ÀÇ ±âÈ£´Â 'sys/socket.h'¶ó´Â Çì´õÆÄÀϾȿ¡ Á¤ÀǵǾî ÀÖ´Ù.
struct sockaddr ÀÚ·áÇü
struct sockaddrÇü ÀÚü´Â ´ÙÀ½ ¸â¹ö¸¦ °¡Áö°í ÀÖ´Ù:
short int sa_family
À̰ÍÀº ÀÌ ÁÖ¼ÒÀÇ ÁÖ¼Ò Æ÷¸Ë¿ë ÄÚµåÀÌ´Ù. ±×°ÍÀº ´ÙÀ½¿¡ ³ª¿À´Â µ¥ÀÌÅÍÀÇ Æ÷¸ËÀ» Áö½ÃÇÑ´Ù.
char sa_data[14]
À̰ÍÀº ½ÇÁ¦ÀûÀÎ ¼ÒÄÏÁÖ¼Ò µ¥ÀÌÅÍÀÌ´Ù. À̰ÍÀº Æ÷¸Ë¿¡ ÀÇÁ¸ÇÑ´Ù. ±×°ÍÀÇ ±æÀÌ´Â ¶ÇÇÑ Æ÷¸Ë¿¡ ÀÇÁ¸ÇÏ °í ¾Æ¸¶ 14º¸´Ù Ŭ °ÍÀÌ´Ù. sa_dataÀÇ 14¶ó´Â ±æÀÌ´Â ¿ø·¡ º¯ÇÒ ¼ö ÀÖ´Ù. °¢ ÁÖ¼ÒÆ÷¸ËÀº AF_·Î ½Ã ÀÛÇÏ´Â ±âÈ£À̸§À¸·Î ½ÃÀ۵ȴÙ. ±×°ÍµéÀº °¢°¢ À̸§°ø°£¿¡ ´ëÀÀµÇ´Â 'PF_' ±âÈ£¿¡ ¸ÂÃçÁ® ÀÖ´Ù.
AF_FILE
À̰ÍÀº ÆÄÀÏ À̸§°ø°£¿¡ ¸Â´Â ÁÖ¼ÒÆ÷¸ËÀÌ´Ù. (PF_FILEÀº ÀÌ À̸§°ø°£ÀÇ À̸§ÀÌ´Ù.) ÀÌ ÁÖ¼Ò Æ÷ ¸ËÀÇ Á¤º¸¸¦ º¸·Á¸é 11.4.2Àý [ÆÄÀÏ À̸§°ø°£ ±¸Ã¼Àû ³»¿ë], 153ÂÊÀ» º¸¶ó.
AF_UNIX
À̰ÍÀº ȣȯ¼ºÀ» À§ÇÑ AF_FILE°ú °°Àº¸»ÀÌ´Ù. (PF_UNIX´Â PF_FILE°ú ¿ª½Ã µ¿ÀǾîÀÌ´Ù.)
AF_INET
À̰ÍÀº ÀÎÅÍ³Ý À̸§°ø°£¿¡ ¸Â´Â ÁÖ¼ÒÆ÷¸ËÀÌ´Ù. (PF_INETÀº ÀÌ À̸§°ø°£ÀÇ À̸§ÀÌ´Ù.) 11.5.1Àý [ÀÎÅÍ ³Ý ÁÖ¼Ò Æ÷¸Ë], 155ÂÊÀ» º¸¾Æ¶ó.
AF_UNSPEC
À̰ÍÀº ƯÁ¤ÇÑ ÁÖ¼ÒÆ÷¸ËÀ» ÁöÁ¤ÇÏÁö ¾Ê´Â´Ù. ±×°ÍÀº "¿¬°áµÈ" µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀÇ ±âº»(default)¸ñÀû Áö ÁÖ¼Ò¸¦ Áö¿ì´Â °Í °°Àº µå¹® °æ¿ì¿¡¸¸ »ç¿ëµÈ´Ù. 11.9.1Àý[µ¥ÀÌÅͱ׷¥ º¸³»±â],176ÂÊÀ» º¸¾Æ¶ó. ¿© ±â¿¡ ¸Â´Â À̸§ °ø°£ÁöÁ¤ÀÚ ±âÈ£µµ ¿ÏÀü¼ºÀ» À§ÇØ Á¸ÀçÇÑ´Ù. ±×·¯³ª, ±×°ÍÀ» ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù.
'sys/socket.h'
¿¡¼ ´ëºÎºÐ ½ÇÁ¦·Î ±¸ÇöµÇÁö ¾ÊÀº ¸¹Àº ´Ù¸¥ Á¾·ùÀÇ ³×Æ®¿öÅ©¿¡ 'AF_'·Î ½ÃÀÛÇÏ´Â ±âÈ£¸¦ Á¤ÀÇÇÏ °í ÀÖ´Ù. ¾î¶»°Ô ±×°ÍÀ» »ç¿ëÇÏ´Â °Í¿¡ °üÇÑ Á¤º¸¸¦ ¿ì¸®°¡ ¹ÞÀ¸¸é, ¿ì¸®´Â ±×°ÍÀ» Á¤¸»·Î ¹®¼ÈÇÒ °ÍÀÌ´Ù.
11.3.2 ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ ¼¼ÆÃÇϱâ.
¼ÒÄÏ¿¡ ÁÖ¼Ò¸¦ ÇÒ´çÇϱâ À§ÇÏ¿© bindÇÔ¼ö¸¦ »ç¿ëÇ϶ó. bindÀÇ ÇÁ·ÎÅäŸÀÔÀº 'sys/socket.h'Çì´õÆÄÀÏ ¿¡ ÀÖ´Ù. »ç¿ë¿¹´Â 11.4Àý[ÆÄÀÏ À̸§°ø°£], 153ÂÊ, ¶Ç´Â 11.5.7Àý[Inet ¿¹Á¦], 163ÂÊÀ» º¸¶ó.
int bind (int socket, struct sockaddr *addr, size_t length) Function
bindÇÔ¼ö´Â "socket"¼ÒÄÏ¿¡ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. addr°ú lengthÀμö´Â ÁÖ¼Ò¸¦ ±¸Ã¼ÈÇÑ´Ù. ÀÚ¼¼ÇÑ ÁÖ¼ÒÆ÷ ¸ËÀº À̸§°ø°£¿¡ ÀÇÁ¸ÇÑ´Ù. ÁÖ¼ÒÀÇ Ã¹ ¹øÂ° ºÎºÐÀº Ç×»ó Æ÷¸ËÁöÁ¤ÀÚÀÌ´Ù. Æ÷¸ËÁöÁ¤ÀÚ´Â À̸§°ø°£À» ¸í½ÃÇϰí, ±× ÁÖ¼Ò°¡ ±× À̸§°ø°£ÀÇ Æ÷¸ËÀÇ ÁÖ¼ÒÀÓÀ» ¸»ÇÑ´Ù. ¼º°øÇϸé 0À» ¸®ÅÏÇϰí, ½ÇÆÐÇϸé -1 À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀǵǾî ÀÖ´Â errno ¿¡·¯ Á¶°ÇÀÌ´Ù.
EBADF
¼ÒÄÏ Àμö°¡ À¯È¿ÇÏÁö ¾ÊÀº ÆÄÀÏ ÁöÁ¤ÀÚÀÌ´Ù.
ENOTSOCK
¼¼úÀÚ socketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EADDRNOTAVAIL
Áö½ÃµÈ ÁÖ¼Ò°¡ ÀÌ ÀåÄ¡¿¡¼´Â À¯È¿ÇÏÁö ¾Ê´Ù.
EADDRINUSE
¶Ç ´Ù¸¥ ¼ÒÄÏÀÌ ÀÌ ÁÖ¼Ò·Î ÀÌ¹Ì »ç¿ëµÇ°í ÀÖ´Ù.
EINVAL
socket¼ÒÄÏÀÌ ÀÌ¹Ì ÁÖ¼Ò¸¦ °¡Áö°í ÀÖ´Ù.
EACCESS
´ç½ÅÀº ¿ä±¸µÈ ÁÖ¼Ò¸¦ Á¦¾îÇÒ Çã°¡±ÇÀ» °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù. (ÀÎÅÍ³Ý µµ¸ÞÀο¡¼, ´ÜÁö ½´ÆÛÀ¯ Àú¸¸ÀÌ 0¿¡¼ IPPORT_RESERVED-1±îÁö ¹üÀ§ÀÇ Æ÷Æ®³Ñ¹ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. 11.5.3Àý[ports] (159 ÂÊ)À» º¸¶ó. )
Ãß°¡ÀûÀÎ Á¶°ÇÀº ¼ÒÄÏÀÇ °¢°¢ À̸§°ø°£¿¡ ÀÇÁ¸ÇÑ´Ù.
11.3.3 ¼ÒÄÏÀÇ ÁÖ¼Ò Àбâ
getsocknameÇÔ¼ö¸¦ »ç¿ëÇÏ¿©, ÀÎÅÍ³Ý ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼öÀÇ ÇÁ·ÎÅäŸÀÔÀº 'sys/socket.h'¶ó´Â Çì´õÆÄÀÏ¿¡ ÀÖ´Ù.
int getsockname (int socket, struct sockaddr *addr, size_t *length_ptr) ÇÔ¼ö
getsocknameÇÔ¼ö´Â addr°ú length_ptr Àμö·Î ¸í½ÃµÇ´Â °÷ÀÇ socketÀ̶ó´Â ¼ÒÄÏÀÇ ÁÖ¼Ò¿¡ °üÇÑ Á¤ º¸¸¦ ¸®ÅÏÇÑ´Ù. length_ptrÀº Æ÷ÀÎÅÍÀÓÀ» ÁÖ¸ñÇ϶ó; ´ç½ÅÀÌ addrÀÇ Å©±â ÇÒ´çÀ» ÃʱâÈÇÒ °ÍÀÌ´Ù. ´ç½ÅÀº addrÀÇ ÇÒ´çÅ©±â¸¦ ÃʱâÈ ÇÒ °ÍÀ̰í, ÁÖ¼Òµ¥ÀÌÅÍÀÇ ½ÇÁ¦Å©±â¸¦ Æ÷ÇÔÇÑ °ÍÀÌ ¸®Å쵃 °ÍÀÌ´Ù.
ÁÖ¼Òµ¥ÀÌÅÍÀÇ Æ÷¸ËÀº ¼ÒÄÏ À̸§°ø°£¿¡ ÀÇÁ¸ÇÑ´Ù. Á¤º¸ÀÇ ±æÀÌ´Â ÁÖ¾îÁø À̸§°ø°£¿¡ º¸Åë ¸ÂÃß¾îÁø ´Ù. ±×·¡¼, º¸Åë ´ç½ÅÀº ÇÊ¿äÇÑ °ø°£ÀÌ Á¤È®È÷ ¾ó¸¶ÀÎÁö ¾Ë ¼ö ÀÖ°í, ±×°Í¸¸Å Á¦°øÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ÀûÀÎ »ç¿ëÀº ¼ÒÄÏÀÇ À̸§°ø°£¿¡ ÀûÇÕÇÑ ÀÚ·áÇüÀ» »ç¿ëÇÏ´Â °ªÀ¸·Î °ø°£À» ÇÒ´çÇÏ°í ³ª¼, ±×°Í À» getsocknameÀ¸·Î ³Ñ±â±â À§ÇØ ±× ÁÖ¼Ò¸¦ struct sockaddr*·Î Çüº¯È¯(cast)ÇÑ´Ù.
¸®Åϰª 0Àº ¼º°øÀ̰í, -1Àº ¿¡·¯ÀÌ´Ù. ´ÙÀ½ ¿¡·¯Á¶°ÇÀº ÀÌ ÇÔ¼ö¿¡¼ Á¤ÀÇµÈ °ÍÀÌ´Ù.
EBADF
¼ÒÄÏÀμö°¡ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK
¼¼úÀÚ socketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
ENOBUFS
µ¿ÀÛÀ» ¼öÇàÇÒ¸¸ÇÑ ÃæºÐÇÑ ¹öÆÛ°¡ ¾ø´Ù.
´ç½ÅÀº À̸§°ø°£ÀÇ ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ ÀÐÀ» ¼ö ¾ø´Ù. À̰ÍÀº ½Ã½ºÅÛÀÇ ³ª¸ÓÁö »çÇ׿¡ ÀÏÄ¡ÇÑ´Ù; ÀϹÝÀû À¸·Î, ±× ÆÄÀÏÀÇ ¼¼úÀڷκÎÅÍ ÆÄÀÏÀÇ À̸§À» ¾ò¾î³¾ ¹æ¹ýÀº ¾ø´Ù.
11.4 The File Namespace
ÀÌ ºÎºÐÀº »ó¡ÀûÀÎ À̸§(¼ÒÄÏÀ» ¸¸µé ¶§ ¿ä±¸ÇÏ´Â) Àº PF_FILEÀ̶ó´Â ÆÄÀÏ À̸§°ø°£¿¡ ´ëÇØ »ó¼¼ È÷ ¼³¸íÇÑ´Ù.
11.4.1 ÆÄÀÏ À̸§°ø°£ °³³äµé
ÆÄÀÏÀ̸§°ø°£¿¡¼, ¼ÒÄÏ ÁÖ¼Ò´Â ÆÄÀÏ À̸§µéÀÌ´Ù. ´ç½ÅÀº ¼ÒÄÏÀÇ ÁÖ¼Òó·³ ´ç½ÅÀÌ ¿øÇÏ´Â ¾î¶² ÆÄ ÀÏ À̸§À» ¸í½ÃÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ´ç½ÅÀº ¹Ýµå½Ã ±×°ÍÀ» Æ÷ÇÔÇÏ´Â µð·ºÅ丮¿¡ ¾²±â Çã°¡¸¦ °¡Áö °í ÀÖ¾î¾ß ÇÑ´Ù. ¼ÒÄÏ¿¡ ¿¬°áÇϱâ À§ÇØ, ´ç½ÅÀº ±×°Í¿¡ ´ëÇÑ Àбâ Çã°¡µµ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. º¸Åë /tmpµð·ºÅ丮 ¾È¿¡ ±×·¯ÇÑ ÆÄÀϵéÀ» ³Ö´Â´Ù.
ÆÄÀÏÀ̸§°ø°£ÀÇ Æ¯º°ÇÑ Á¡ Çϳª´Â ¿¬°áÀ» ÇÒ ¶§ ±× À̸§ÀÌ ÇÑ ¹ø¸¸ »ç¿ëµÈ´Ù´Â °ÍÀÌ´Ù. Áï, ±×°Í À» ÇÑ ¹ø »ç¿ëÇÏ°í ³ª¸é, ±× ÁÖ¼Ò´Â Àǹ̰¡ ¾ø°í, Á¸ÀçÇÏÁö ¾ÊÀ»Áöµµ ¸ð¸¥´Ù.
¶Ç ´Ù¸¥ Ư¡Àº ¸¸¾à ¼ÒÄÏÀÇ À̸§À» Æ÷ÇÔÇÏ´Â ÆÄÀϽýºÅÛÀ» ´Ù¸¥ ±â±â°¡ °øÀ¯ÇÏÁö ¾Ê´Â´Ù¸é ´Ù ¸¥ ±â±âÀÇ ¾î¶² ¼ÒÄÏÀ¸·Î ¿¬°áÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ´ç½ÅÀº µð·ºÅ丮 ¸®½ºÆ® ¾È¿¡¼ ¼ÒÄÏÀ» º¼ ¼ö ÀÖÀ¸³ª, ±×°Í¿¡ ¿¬°áÇÏ´Â °ÍÀº ºÒ°¡´É ÇÏ´Ù. ¾î¶² ÇÁ·Î±×·¥µéÀº Ŭ¶óÀÌ¾ðÆ®°¡ ÀÚ±â ÇÁ·Î¼¼½º ID¸¦ º¸³»µµ·Ï ¿ä±¸ÇÏ´Â °Í°ú ÇÁ·Î¼¼½ºID¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® °£À» ½Äº°ÇÏ´Â °ÍÀ» ÀÌ¿ëÇÏ´Â °Í µîÀ» ÀÌ¿ëÇÑ´Ù. ±×·¯³ª, ¿ì¸®´Â ´ç½ÅÀÌ ¼³°èÇÏ´Â ÇÁ·ÎÅäÄÝµé ¾È¿¡¼ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸»±â¸¦ ¿øÇÑ´Ù. ¿ì¸®´Â °°Àº ÆÄÀϽýºÅÛÀ» »ç¿ëÇÏ´Â ´Ù¸¥ ±â±â·Î ºÎÅÍÀÇ ¿¬°áµéÀ» Çã¶ôÇØ¾ß ÇÒÁöµµ ¸ð¸£±â ¶§¹®ÀÌ ´Ù. ´ë½Å¿¡, ¸¸¾à ±×°ÍÀ» °¡Áö´Â °ÍÀ» ¿øÇÑ´Ù¸é, °¢ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ½Äº°¹øÈ£¸¦ º¸³½´Ù.
ÆÄÀÏ À̸§°ø°£¾ÈÀÇ ¼ÒÄÏÀ» ´ÝÀº ÈÄ¿¡, ´ç½ÅÀº ÆÄÀϽýºÅÛÀ¸·ÎºÎÅÍ ÆÄÀÏÀ̸§À» Áö¿ö¾ß ÇÑ´Ù. unlink ³ª remove¸¦ »ç¿ëÇÏ¿© À̰ÍÀ» Ç϶ó. 9.5Àý [ÆÄÀÏ »èÁ¦Çϱâ], 129ÂÊÀ» º¸¶ó.
ÆÄÀÏ À̸§°ø°£Àº ´ÜÁö ¾î¶² Åë½Å ½ºÅ¸ÀÏ¿¡ ´ëÇØ ÇϳªÀÇ ÇÁ·ÎÅäÄݸ¸ Áö¿øÇÑ´Ù. ±×°ÍÀº ÇÁ·ÎÅäÄÝ ¹ø È£ 0ÀÌ´Ù.
11.4.2 ÆÄÀÏÀ̸§ °ø°£ÀÇ ÀÚ¼¼ÇÑ °Í
ÆÄÀÏ À̸§ °ø°£¿¡ ¼ÒÄÏÀ» ¸¸µé·Á¸é, socket¶Ç´Â sockerpairÀÇ À̸§°ø°£ Àμö¿¡ »ó¼ö PF_FILEÀ» »ç¿ëÇ϶ó. ÀÌ »ó¼ö´Â 'sys/socket.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
int PF__FILE Macro
À̰ÍÀº ¼ÒÄÏÁÖ¼Ò°¡ ÆÄÀÏÀ̸§ÀÎ ÆÄÀÏÀ̸§ °ø°£°ú ±×°ÍÀÌ ¿¬ÇÕµÈ ÇÁ·ÎÅäÄÝ ÆÐ¹Ð¸®¸¦ °¡¸®Å²´Ù.
int PF__UNIX Macro
À̰ÍÀº ȣȯ¼ºÀ» À§ÇÑ PF_FILEÀÇ µ¿ÀǾîÀÌ´Ù.
ÆÄÀÏÀ̸§°ø°£ÀÇ ¼ÒÄÏÀ̸§À» ¸í½ÃÇÏ´Â ±¸Á¶Ã¼´Â 'sys/un.h'¶ó´Â Çì´õÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù. :
struct sockaddr__un Data Type
ÀÌ ±¸Á¶Ã¼´Â ÆÄÀÏÀ̸§°ø°£À» ¼ÒÄÏ ÁÖ¼Ò·Î ¸í½ÃÇϴµ¥ »ç¿ëµÈ´Ù.
short int sun_family
À̰ÍÀº ¼ÒÄÏÁÖ¼Ò¸¦ À§ÇÑ Çüųª ÁÖ¼ÒÆÐ¹Ð¸®¸¦ ¸í½ÃÇÑ´Ù. ´ç½ÅÀº ÆÄÀÏÀ̸§°ø°£À» ÁöÁ¤Çϱâ À§ÇÏ¿© AF_FILE°ªÀ» ÀúÀåÇØ¾ß ÇÑ´Ù. 11.3Àý [¼ÒÄÏÁÖ¼Ò], 150ÂÊÀ» º¸¶ó.
char sun_path[108]
À̰ÍÀº »ç¿ëµÇ´Â ÆÄÀÏÀ̸§ÀÌ´Ù.
¹Ì¿Ï¼º: ¿Ö 108ÀÌ ¸ÅÁ÷³Ñ¹öÀΰ¡? RMS´Â À̰ÍÀ» ±æÀ̰¡ 0ÀÎ ¹è¿À» ¸¸µå´Â °Í°ú ÆÄÀÏÀ̸§ÀÇ ±æÀÌ¿¡ ±âÃÊÇÏ¿© ÀûÇÕÇÑ ÀúÀå°ø°£À» ÇÒ´çÇϱâ À§ÇØ allocate¸¦ »ç¿ëÇÏ´Â °Í°ú °°Àº ¿¹¸¦ ²¿Áý¾î Á¦¾ÈÇÑ ´Ù.
´ç½ÅÀº sun_family¿ä¼ÒÀÇ Å©±â¿Í ÆÄÀÏÀ̸§¹®ÀÚ¿ÀÇ (ÇÒ´ç Å©±â°¡ ¾Æ´Ñ)¹®ÀÚ¿ ±æÀÌÀÇ ÇÕÀÎ, ÆÄÀÏÀÌ ¸§°ø°£¿¡ ¼ÒÄÏÁÖ¼Ò¸¦ À§ÇÑ ±æÀÌ ¸Å°³º¯¼ö¸¦ °è»êÇØ¾ß ÇÑ´Ù.
11.4.3 ÆÄÀÏ-À̸§°ø°£ ¼ÒÄÏÀÇ ¿¹
¿©±âÀÖ´Â °ÍÀº ÆÄÀÏÀ̸§°ø°£ÀÇ ¼ÒÄÏÀ» ¸¸µé°í À̸§Áö¾îÁÖ´Â ¹æ¹ýÀ» º¸¿©ÁÖ´Â ¿¹ÀÌ´Ù.
#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
int
make_named_socket (const char *filename)
{
struct sockaddr_un name;
int sock;
size_t size;
/* ¼ÒÄϸ¸µé±â */
sock = socket (PF_UNIX, SOCK_DGRAM, 0);
if (sock < 0)
{
perror ("socket");
exit (EXIT_FAILURE);
}
/* Bind a name to the socket. */
name.sun_family = AF_FILE;
strcpy (name.sun_path, filename);
/* The size of the address is the offset of the start of the filename, plus its length, plus one for the terminating null byte. */
size = (offsetof (struct sockaddr_un, sun_path) + strlen (name.sun_path) + 1);
if ( bind (sock, (struct sockaddr *) &name, size) <0)
{
perror ("bind");
exit (EXIT_FAILURE);
}
return sock;
}
11.5 ÀÎÅÍ³Ý À̸§°ø°£
ÀÌ Àå¿¡¼´Â ÇÁ·ÎÅäÄݰú ¼ÒÄÏÀÌ ÀÎÅÍ³Ý À̸§°ø°£¿¡¼ »ç¿ëµÇ´Â À̸§Áþ´Â ¹æ¹ý¿¡ ´ëÇØ ¼¼úÇÑ´Ù.
ÀÎÅÍ³Ý À̸§°ø°£¿¡¼ ¼ÒÄÏÀ» ¸¸µé·Á¸é, socketÀ̳ª socketpairÀÇ À̸§ °ø°£Àμö·Î ÀÌ À̸§°ø°£ÀÇ PF_INET±âÈ£¸¦ »ç¿ëÇÑ´Ù. ÀÌ ¸ÅÅ©·Î´Â 'sys/socket.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
int PF__INET Macro
À̰ÍÀº ÀÎÅÍ³Ý À̸§°ø°£À» ÁöÁ¤Çϰí ÇÁ·ÎÅäÄÝÀÇ ¿¬ÇÕµÈ ÆÐ¹Ð¸®¸¦ ÁöÁ¤ÇÑ´Ù.
ÀÎÅÍ³Ý À̸§°ø°£ÀÇ ¼ÒÄÏ ÁÖ¼Ò´Â ´ÙÀ½°ú °°Àº ¼ººÐÀ» Æ÷ÇÔÇÑ´Ù:
o ´ç½ÅÀÌ ¿¬°áÇϱ⠿øÇÏ´Â ÀåÄ¡ÀÇ ÁÖ¼Ò. ÀÎÅÍ³Ý ÁÖ¼Ò´Â ¸î°¡Áö ¹æ¹ýÀ¸·Î Ç¥ÇöµÉ ¼ö ÀÖ´Ù. ; ÀÌ·¯ÇÑ ¹æ¹ýµéÀº 11.5.1Àý [È£½ºÆ® ÁÖ¼Ò] 155ÆäÀÌÁö ¿Í 11.5.2.4Àý [È£½ºÆ® À̸§] 158ÆäÀÌÁö¿¡¼ ³íÀÇÇÑ´Ù.
o ±× ÀåÄ¡ÀÇ Æ÷Æ® ¹øÈ£. 11.5.3Àý [Æ÷Æ®] 159ÂÊÀ» º¸¶ó
´ç½ÅÀº ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£°¡ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼¶ó°í ºÒ¸®¿ì´Â Á¤±ÔÈ µÈ Æ÷¸ËÀ¸·Î Ç¥ÇöµÈ´Ù´Â °Í À» ¾Ë¾Æ¾ß ÇÑ´Ù. ÀÌ¿¡ °üÇÑ Á¤º¸´Â 11.5.5Àý [¹ÙÀÌÆ® ¼ø¼] 161ÂÊÀ» º¸¶ó
11.5.1 ÀÎÅÍ³Ý ¼ÒÄÏ ÁÖ¼Ò Æ÷¸Ë
ÀÎÅÍ³Ý À̸§°ø°£¿¡¼, ¼ÒÄÏÁּҴ ȣ½ºÆ®ÀÇ ÁÖ¼Ò¿Í ±× È£½ºÆ®ÀÇ Æ÷Æ®¸¦ Æ÷ÇÔÇÑ´Ù. Ãß°¡ÀûÀ¸·Î ´ç½Å ÀÌ ¼±ÅÃÇÑ ÇÁ·ÎÅäÄÝÀº ÁÖ¼ÒÀÇ ÀϺκÐó·³ È¿°úÀûÀ¸·Î Á¦°øµÈ´Ù. ¿Ö³ÄÇϸé Áö¿ªÀûÀÎ Æ÷Æ®¹øÈ£´Â ƯÁ¤ÇÑ ÇÁ·ÎÅäÄݾȿ¡¼ Àǹ̸¦ °¡Áö±â ¶§¹®ÀÌ´Ù. ÀÎÅÍ³Ý À̸§°ø°£¾ÈÀÇ ¼ÒÄÏ ÁÖ¼ÒÀÇ Ç¥Çö¿¡ °üÇÑ ÀÚ ·áÇüÀº 'netinet/in.h' Çì´õÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù.
struct sockaddr__in Data Type
À̰ÍÀº ÀÎÅÍ³Ý À̸§°ø°£¾ÈÀÇ ¼ÒÄÏÁÖ¼Ò¸¦ Ç¥ÇöÇϴµ¥ »ç¿ëµÇ´Â ÀÚ·áÇüÀÌ´Ù. ±×°ÍÀº ´ÙÀ½ ¸â¹ö¸¦ °¡Áø ´Ù.
short int sin_family
À̰ÍÀº ¼ÒÄÏÁÖ¼ÒÀÇ Æ÷¸ËÀ̳ª ÁÖ¼Ò ÆÐ¹Ð¸®¸¦ Áö½ÃÇÑ´Ù. ´ç½ÅÀº ÀÌ ¸â¹ö³»¿¡ AF_INET°ªÀ» ÀúÀåÇØ¾ß ÇÑ´Ù. 11.3Àý [¼ÒÄÏÁÖ¼Ò] 150ÂÊÀ» º¸¶ó
struct in_addr sin_addr
À̰ÍÀº È£½ºÆ® ÀåÄ¡ÀÇ ÀÎÅÍ³Ý ÁÖ¼ÒÀÌ´Ù. ¾î¶»°Ô ¿©±â¿¡ ³ÖÀ» °ªÀ» ¾ò´ÂÁö¿¡ °üÇÏ¿©´Â 11.5.2Àý [È£½ºÆ® ÁÖ¼Ò] 155Âʰú 11.5.2.4 [È£½ºÆ® À̸§] 158ÂÊÀ» º¸¶ó.
unsigned short int sin_port
À̰ÍÀº Æ÷Æ®¹øÈ£ÀÌ´Ù. 11.5.3Àý [Æ÷Æ®] 159ÂÊÀ» º¸¶ó.
´ç½ÅÀÌ bind³ª setsocknameÀ» È£ÃâÇÒ ¶§, ¸¸¾à ´ç½ÅÀÌ ÀÎÅÍ³Ý À̸§°ø°£ ¼ÒÄÏ ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù¸é, ' ±æÀÌ' ¸Å°³º¯¼ö·Î sizeof (struct sockaddr_in)À» ¸í½ÃÇØ¾ß ÇÑ´Ù.
11.5.2 È£½ºÆ® ÁÖ¼Ò
ÀÎÅͳÝÀÇ °¢ ÄÄÇ»ÅÍ´Â Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ °¡Áø´Ù. ÁÖ¼Ò´Â ÀÎÅͳÝÀÇ ¸ðµç °Íµé »ç ÀÌ¿¡¼ ±× ÄÄÇ»Å͸¦ Áö½ÃÇÏ´Â ¼ýÀÚÀÌ´Ù. »ç¿ëÀÚ´Â Åë»ó ¼ýÀÚ·ÎµÈ È£½ºÆ® ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù. ±×°ÍÀº '128.52.46.32'ó·³ ³× ¼ýÀÚ·Î µÇ¾î ÀÖ°í Á¡À¸·Î ³ª´µ¾îÁ® ÀÖ´Ù. °¢ ÄÄÇ»ÅÍ´Â ¶ÇÇÑ Çϳª ¶Ç´Â ±× ÀÌ »óÀÇ È£½ºÆ® À̸§À» °¡Áø´Ù. ±×°ÍÀº 'churchy.gnu.ai.mit.edu'ó·³ Á¡À¸·Î ³ª´µ¾îÁø ´Ü¾îÀÇ ¹®ÀÚ¿ÀÌ ´Ù.
»ç¿ëÀÚ°¡ È£½ºÆ®¸¦ ¸í½ÃÇϰÔÇÏ´Â ÇÁ·Î±×·¥Àº ÀüÇüÀûÀ¸·Î ¼ýÀÚÁÖ¼Ò¿Í È£½ºÆ® À̸§ ¸ðµÎ¸¦ ¼ö¿ëÇÑ ´Ù. ±×·¯³ª ÇÁ·Î±×·¥Àº ¿¬°áÀ» À§ÇØ ¼ýÀÚ·ÎµÈ ÁÖ¼Ò¸¦ ÇÊ¿ä·Î ÇÑ´Ù. Áï È£½ºÆ® ÁÖ¼Ò¸¦ »ç¿ëÇϱâ À§ ÇØ, ´ç½ÅÀº ±×°ÍÀÌ »ó¡Çϰí ÀÖ´Â ¼ýÀÚ ÁÖ¼Ò·Î º¯È¯ÇØ¾ß ÇÑ´Ù.
11.5.2.1 ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò
ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò´Â µ¥ÀÌÅÍÀÇ 4¹ÙÀÌÆ®¸¦ Æ÷ÇÔÇÏ´Â ¼ýÀÚÀÌ´Ù. ±×°ÍµéÀº µÎºÎºÐÀ¸·Î ³ª´µ´Âµ¥, ³×Æ®¿öÅ© ¹øÈ£¿Í ±× ³×Å©¿öÅ©³»ÀÇ Áö¿ª ³×Æ®¿öÅ© ÁÖ¼Ò ¹øÈ£°¡ ±×°ÍÀÌ´Ù. ³×Æ®¿öÅ© ¼ýÀڴ óÀ½ Çϳª, µÑ¶Ç´Â ¼¼ °³ÀÇ ¹ÙÀÌÆ®¸¦ Æ÷ÇÔÇÑ´Ù. ³ª¸ÓÁö ¹ÙÀÌÆ®´Â Áö¿ª ÁÖ¼ÒÀÌ´Ù.
³×Æ®¿öÅ© ¹øÈ£µéÀº ³×Æ®¿öÅ© Á¤º¸ ¼¾ÅÍ (NIC, Network Information Center)¿¡ µî·ÏµÇ¾î ÀÖ´Ù. ±×°ÍµéÀº ¼¼ °³ÀÇ Å¬·¡½º A,B,C·Î ºÐÇҵȴÙ. °¢°¢ ÄÄÇ»Å͸¶´ÙÀÇ Áö¿ª³×Æ®¿öÅ© ÁÖ¼Ò´Â °¢ ³×Æ®¿öÅ© ÀÇ °ü¸®ÀÚ¿¡ ÀÇÇØ µî·ÏµÇ¾î ÀÖ´Ù.
Ŭ·¡½º A ³×Æ®¿öÅ©´Â 0¿¡¼ 127¹üÀ§ÀÇ ÇÑ ¹ÙÀÌÆ® ¼ýÀÚ¸¦ °¡Áø´Ù. Ŭ·¡½º A ³×Æ®¿öÅ©ÀÇ ¼ö´Â ¸Å ¿ì ÀÛÁö¸¸, °¢°¢Àº ±²ÀåÈ÷ ¸¹Àº ¼öÀÇ È£½ºÆ®¸¦ Áö¿øÇÑ´Ù. Áß°£Å©±âÀÇ Å¬·¡½º B ³×Æ®¿öÅ©´Â µÎ¹ÙÀÌ Æ®ÀÇ ³×Æ®¿öÅ© ¹øÈ£¸¦ °¡Áø´Ù. ù ¹øÂ° ¹ÙÀÌÆ®ÀÇ ¹üÀ§´Â 128¿¡¼ 191±îÁöÀÌ´Ù. Ŭ·¡½º C ³×Æ®¿öÅ© ´Â °¡Àå ÀÛ´Ù. ±×°ÍµéÀº ¼¼ ¹ÙÀÌÆ®ÀÇ ³×Æ®¿öÅ© ¹øÈ£¸¦ °¡Áö¸ç, ù ¹øÂ° ¹ÙÀÌÆ®ÀÇ ¹üÀ§´Â 192¿¡¼ 255 ±îÁöÀÌ´Ù. ±×·¯¹Ç·Î, ÀÎÅÍ³Ý ÁÖ¼ÒÀÇ Ã³À½ 1, 2, 3¹ÙÀÌÆ®´Â ³×Æ®¿öÅ©¸¦ ¸í½ÃÇÏ´Â °ÍÀÌ´Ù. ÀÎÅÍ³Ý ÁÖ¼Ò ÀÇ ³ª¸ÓÁö ¹ÙÀÌÆ®´Â ³×´ÀÅýÅ© ¾È¿¡¼ÀÇ ÁÖ¼Ò¸¦ ¸í½ÃÇÑ´Ù. Ŭ·¡½º A³×Æ®¿öÅ© 0Àº ¸ðµç ³×Æ®¿öÅ©¿¡ ºê·Îµåij½ºÆ®¿ëÀ¸·Î ¿¹¾àµÇ¾î ÀÖ´Ù. Ãß°¡ÀûÀ¸·Î °¢ ³×Æ®¿öÅ© ³»¿¡¼ÀÇ È£½ºÆ® ¹øÈ£°¡ 0ÀÎ °ÍÀº ±× ³×Æ®¿öÅ© ³»ÀÇ ¸ðµç È£½ºÆ®µé¿¡°Ô ¹æ¼Û(broadcast)Çϱâ À§ÇØ ¿¹¾àµÇ¾î ÀÖ´Ù. Ŭ·¡½º A ³×Æ®¿öÅ© 127 Àº ·çÇÁ¹é(loopback)¿ëÀ¸·Î ¿¹¾àµÇ¾î ÀÖ´Ù. ´ç½ÅÀº ±×·¯¹Ç·Î ÀÎÅÍ³Ý ÁÖ¼Ò '127.0.0.1'À» »ç¿ëÇϸé ÀڽŠÀÇ È£½ºÆ®ÀåÄ¡¸¦ ÂüÁ¶ ÇÒ ¼ö ÀÖ´Ù.
´ÜÀÏ ÀåÄ¡´Â ¿©·¯°³ÀÇ ³×Æ®¿öÅ©ÀÇ ¸â¹ö°¡ µÉ ¼ö ÀÖÀ¸¹Ç·Î, ±×°ÍÀº ¿©·¯°³ÀÇ È£½ºÆ® ÁÖ¼Ò¸¦ °¡Áú ¼ö ÀÖ´Ù. ±×·¯³ª, °°Àº È£½ºÆ® ÁÖ¼Ò¸¦ °¡Áø ÀåÄ¡°¡ Çϳª ÀÌ»ó À־ ¾È µÈ´Ù.
ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ À§ÇÑ ¼ýÀÚ¿Í À̸§ Ç¥ÇöÀº ³×°¡Áö ÇüŰ¡ ÀÖ´Ù:
a.b.c.d
À̰ÍÀº °¢°³º°ÀûÀ¸·Î ÁÖ¼ÒÀÇ ¸ðµç ³× °³ÀÇ ¹ÙÀÌÆ®¸¦ ³ªÅ¸³½´Ù.
a.b.c
ÁÖ¼ÒÀÇ ¸¶Áö¸· ºÎºÐÀÎ c´Â 2¹ÙÀÌÆ®·Î Ãë±ÞµÈ´Ù. À̰ÍÀº ³×Æ®¿öÅ© ¹øÈ£ a.b¸¦ °¡Áø Ŭ·¡½º BÀÇ È£ ½ºÆ® ÁÖ¼Ò¸¦ ³ªÅ¸³»´Âµ¥ À¯¿ëÇÏ´Ù.
a.b
ÁÖ¼ÒÀÇ ¸¶Áö¸· ºÎºÐÀÎ b´Â 3¹ÙÀÌÆ®·Î Ãë±ÞµÈ´Ù. À̰ÍÀº ³×Æ®¿öÅ© ÁÖ¼Ò a¸¦ °¡Áø Ŭ·¡½ºAÀÇ È£½ºÆ® ÁÖ¼Ò¸¦ Ç¥½ÃÇϴµ¥ À¯¿ëÇÏ´Ù.
a
¸¸¾à ÇϳªÀÇ ºÎºÐ¸¸ ÁÖ¾îÁø´Ù¸é, À̰ÍÀº È£½ºÆ® ÁÖ¼Ò¿¡ Á÷Á¢ ÀÏÄ¡ÇÏ°Ô µÈ´Ù.
ÁÖ¼ÒÀÇ °¢ºÎºÐ¿¡¼, ±â¼ö¸¦ Ç¥½ÃÇϱâ À§ÇØ º¸Åë C°ü·Ê¸¦ »ç¿ëÇÑ´Ù. ´Ù¸¥¸»·Î Çϸé, '0x' ¶Ç´Â '0X' ·Î ½ÃÀÛÇÏ´Â °ÍÀº 16Áø¼ö ±â¼ö¸¦ ³»Æ÷ÇÑ´Ù. '0'À¸·Î ½ÃÀÛÇÏ´Â °ÍÀº 8Áø¼ö¸¦ ³»Æ÷Çϰí, ´Ù¸¥ °ÍÀº 10 Áø¼ö ±â¼ö·Î °¡Á¤ÇÑ´Ù.
11.5.2.2 È£½ºÆ® ÁÖ¼Ò ÀÚ·áÇü
ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò´Â Á¤¼öÇüµé(unsigned long intÇü)°°Àº Çü½ÄÀ¸·Î Ç¥ÇöµÈ´Ù. ´Ù¸¥ ¸»·ÎÇϸé, Á¤ ¼öµéÀº struct in_addrÀÇ ÇüÅÂÀÇ ±¸Á¶Ã¼¾È¿¡ µé¾î°¡°Ô µÈ´Ù. ¸¸¾à ¿ë¹ýÀÌ ÀÏÄ¡µÇ¸é ÁÁÀ» °ÍÀ̳ª, ±×·¸ Áö ¸øÇÏ´Ù¸é, ±¸Á¶Ã¼·Î ºÎÅÍ Á¤¼ö¸¦ »Ì¾Æ³»°Å³ª, Á¤¼ö¸¦ ±¸Á¶Ã¼¿¡ ³Ö´Â °ÍÀÌ ½±Áö ¾ÊÀ» °ÍÀÌ´Ù. ´ÙÀ½ ÀÎÅÍ³Ý ÁÖ¼Ò¿¡ °üÇÑ ±âº»ÀûÀÎ Á¤ÀÇ´Â 'netinet/in.h'Çì´õ ÆÄÀÏ ¾È¿¡¼ º¼¼ö ÀÖ´Ù:
struct in_addr ÀÚ·áÇü
ÀÌ ÀÚ·áÇüÀº ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ Æ÷ÇÔÇÏ´Â Á¤È®ÇÑ ¹®¸Æ¿¡ »ç¿ëµÈ´Ù. ±×°ÍÀº ´ÜÁö s_addrÀ̶ó´Â ÇϳªÀÇ Çʵ带 °¡Áø´Ù. ±×°ÍÀº unsigned long int ó·³ È£½ºÆ® ÁÖ¼Ò¹øÈ£¸¦ ÀúÀåÇÑ´Ù.
unsigned long int INADDR__LOOPBACK Macro
´ç½ÅÀº ÀÌ ÀåÄ¡ÀÇ ½ÇÁ¦ÁÖ¼Ò¸¦ ã´Â ´ë½Å¿¡, ÀÌ »ó¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×°ÍÀº º¸Åë 'localhost(·Î ÄÃÈ£½ºÆ®)'¶ó ºÒ¸®¿ì´Â ÀÎÅÍ³Ý ÁÖ¼Ò '127.0.0.1'ÀÌ´Ù. ÀÌ Æ¯º°ÇÑ »ó¼ö´Â ´ç½ÅÀÇ ÀåÄ¡ÀÇ ÁÖ¼Ò¸¦ »ì ÇǴµ¥ »ý±â´Â ¹®Á¦¸¦ ÇØ°áÇØ ÁØ´Ù. ¶ÇÇÑ, ½Ã½ºÅÛÀº ÇÑ ÀåÄ¡¿¡¼ ÀÚ±âÀÚ½ÅÀ¸·Î Àü¼ÛÇÏ´Â °æ¿ì ¾î ¶² ³×Æ®¿öÅ©Àü¼ÛÀ» ÇÇÇϱâ À§ÇØ, ÁÖ·Î INADDR_LOOPBACKÀ» Ưº°È÷ ±¸ÇöÇϰí ÀÖ´Ù.
unsigned long int INADDR__ANY Macro
ÁÖ¼Ò¸¦ ¹ÙÀεùÇÒ ¶§, "¾î¶°ÇÑ ¿À´Â ÁÖ¼Ò(any incoming address)"¿¡ ´ëÇÑ °ÍÀ» ÀÌ »ó¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. 11.3.2Àý [ÁÖ¼Ò ¼³Á¤], 152ÆäÀÌÁö¸¦ º¸¶ó. À̰ÍÀº ´ç½ÅÀÌ ÀÎÅÍ³Ý ¿¬°áÀ» ¹Þ¾ÆµéÀÌ±æ ¿øÇÒ ¶§, sockaddr_in±¸Á¶Ã¼ÀÇ sin_addr¸â¹ö¿¡ ÁÖ·Î µé¾î°¡´Â ÁÖ¼ÒÀÌ´Ù.
unsigned long int INADDR__BROADCAST Macro
ÀÌ »ó¼ö´Â ¹æ¼Û¸Þ½ÃÁö¸¦ º¸³»´Âµ¥ »ç¿ëµÇ´Â ÁÖ¼ÒÀÌ´Ù.
unsigned long int INADDR__NONE Macro
ÀÌ »ó¼ö´Â ¾î¶² ÇÔ¼öµéÀÌ ¿¡·¯¸¦ Áö½ÃÇϱâ À§ÇØ ¹ÝȯµÈ´Ù.
11.5.2.3 È£½ºÆ® ÁÖ¼Ò ÇÔ¼öµé
ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ Á¶ÀÛÇÏ´Â Ãß°¡ÀûÀÎ ÇÔ¼öµéÀº 'arpa/inet.h'¾È¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ±×°ÍµéÀº ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ Ç¥ÇöÇÑ´Ù. Áï ±×°ÍµéÀº ³×Æ®¿öÅ© ¹øÈ£¿Í ³×Æ®¿öÅ© ¾È¿¡¼ÀÇ Áö¿ª ÁÖ ¼Ò¸¦ È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼·Î Ç¥ÇöÇÑ´Ù. ³×Æ®ÄõÀ¸¿Í È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼¿¡ °üÇÑ ¼³¸íÀº 11.5.3Àý [¹Ù ÀÌÆ® ¼ø¼] 161ÂÊÀ» º¸¶ó.
int inet__aton (const char *name, struct in_addr *addr) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò À̸§À» Ç¥ÁØ ¼ýÀÚ¿Í Á¡ Ç¥½ÃÇü½Ä¿¡¼ ÀÌÁøµ¥ÀÌÅÍ ÇüÀ¸·Î º¯È¯ÇÑ´Ù. ±×¸®°í, ±×°ÍÀ» addrÀÌ Áö½ÃÇϰí ÀÖ´Â struct in_addr¾È¿¡ ÀúÀåÇÑ´Ù.
unsigned long int inet__addr (const char *name) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ÀÎÅͳÝÁÖ¼Ò À̸§À» ¼ýÀÚ¿Í Á¡À¸·Î µÈ °Í¿¡¼ ÀÌÁø µ¥ÀÌÅÍ·Î º¯È¯ÇÑ´Ù. ¸¸¾à ÀÔ·ÂÀÌ À¯ È¿ÇÏÁö¾ÊÀ¸¸é, inet_addrÀº INADDR_NONE¸¦ ¹ÝȯÇÑ´Ù. À̰ÍÀº À§¿¡¼ ¼¼úÇÑ inet_atonÀÇ ±¸½ÄÀÇ ÀÎÅÍÆäÀ̽ºÀÌ´Ù. INADDR_NONEÀº À¯È¿ÇÑ ÁÖ¼Ò( 255.255.255.255)À̱⶧¹®¿¡ ±×°ÍÀº ¾µ¸ð ¾øÀÌ µÇ¾ú ´Ù. ±×¸®°í inet_aton Àº ¿¡·¯ ¹ÝȯÀ» Áö½ÃÇÏ´Â ´õ ±ò²ûÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù.
unsigned long int inet__network (const char *name) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼ýÀÚ¿Í Á¡À¸·Î Ç¥ÇöµÇ´Â ÁÖ¼ÒÀ̸§À¸·Î ºÎÅÍ ³×Æ®¿öÅ© ¹øÈ£¸¦ »Ì¾Æ³½´Ù. ¸¸¾à ÀÔ·ÂÀ» Á¦´ë ·Î ÇÏÁö ¾ÊÀ¸¸é, inet_network´Â -1À» ¹ÝȯÇÑ´Ù.
char * inet__ntoa (struct in_addr addr) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò addrÀ» ¼ýÀÚ¿Í Á¡À¸·Î Ç¥ÇöµÇ´Â ¹®ÀÚ¿·Î º¯È¯ÇÑ´Ù. ¹ÝȯµÇ´Â °ªÀº Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀÇ Æ÷ÀÎÅÍÀÌ´Ù. °è¼Ó È£ÃâÇÏ¸é °°Àº ¹öÆÛ¿¡ µ¤¾î ¾²±â¸¦ ÇϹǷÎ, ¸¸¾à ±×°ÍÀ» ÀúÀåÇϱâ À§Çؼ ±× ¹®ÀÚ¿À» º¹»çÇØµÎ¾î¾ß ÇÑ´Ù.
struct in_addr inet__makeaddr (int net, int local) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â Áö¿ª ³×Æ®¿öÅ© ³»ÀÇ Áö¿ª ÁÖ¼Ò local°ú ³×Æ®¿öÅ© ¹øÈ£ net¸¦ ¹¾î ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò¸¦ ¸¸µç´Ù.
int inet__lnaof (struct in_addr addr) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼Ò addrÀÇ ÀϺÎÀÎ ³×Æ®¿öÅ© ³»¿¡¼ÀÇ Áö¿ª ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.
int inet__netof (struct in_addr addr) Function
ÀÌ ÇÔ¼ö´Â ÀÎÅÍ³Ý È£½ºÆ® ÁÖ¼ÒÀÇ ÀϺÎÀÎ ³×Æ®¿öÅ© ¹øÈ£¸¦ ¹ÝȯÇÑ´Ù.
11.5.2.4 È£½ºÆ® À̸§µé
ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ À§ÇÑ ¼ýÀÚ¿Í Á¡À¸·Î Ç¥ÇöÇÏ´Â °Í ¿Ü¿¡, ´ç½ÅÀº ÀǹÌÀÖ´Â À̸§À» »ç¿ëÇÏ¿© È£½ºÆ®¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ÀǹÌÀÖ´Â À̸§À» »ç¿ëÇÏ´Â °ÍÀÇ ÀåÁ¡Àº ¿ª½Ã ¿Ü¿ì±â ½±´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ÀÎÅÍ³Ý ÁÖ¼Ò '128.52.46.32'¸¦ °¡Áø ÀåÄ¡´Â 'churchy.gnu.ai.mit.edu'·Îµµ Ç¥ÇöµÈ´Ù. ¶ÇÇÑ 'gnu.ai.mit.edu' µµ¸ÞÀγ»ÀÇ ´Ù¸¥ ÄÄÇ»Å͵éÀº °£´ÜÇÏ°Ô 'churchy'·Î ÀÌ ÀåÄ¡¸¦ ÂüÁ¶ÇÒ¼ö ÀÖ´Ù.
³»ºÎÀûÀ¸·Î, ½Ã½ºÅÛÀº È£½ºÆ® À̸§°ú È£½ºÆ® ¹øÈ£ »çÀÌÀÇ ¸ÅÇÎÀÇ Á¤º¸¸¦ À¯ÁöÇÏ´Â µ¥ÀÌÅͺ£À̽º ¸¦ »ç¿ëÇÑ´Ù. ÀÌ µ¥ÀÌÅͺ£À̽º´Â º¸Åë '/etc/hosts'À̰ųª ³×ÀÓ¼¹ö¿¡ ÀÇÇØ Á¦°øµÈ´Ù. ÀÌ µ¥ÀÌÅÍ º£ À̽º¿¡ Á¢±ÙÇϱâ À§ÇÑ ÇÔ¼ö¿Í±âÈ£µéÀº 'netdb.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ 'netdb.h'¸¦ Æ÷ÇÔÇÑ ´Ù¸é, ±×°ÍµéÀº ¹«Á¶°ÇÀûÀ¸·Î Á¤ÀǵǾî ÀÖ´Â BSDµéÀÇ Æ¯Â¡ÀÌ´Ù.
struct hostent ÀÚ·áÇü
ÀÌ ÀÚ·áÇüÀº È£½ºÆ® µ¥ÀÌÅͺ£À̽º¾ÈÀÇ ³»¿ëÀ» Ç¥ÇöÇÏ´Â µ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº ´ÙÀ½ ¸â¹ö¸¦ °¡Áø´Ù.:
char *h_name
À̰ÍÀº È£½ºÆ®ÀÇ "»ç¹«ÀûÀÎ" À̸§ÀÌ´Ù.
char **h_aliases
½ºÆ®¸µÀÇ null·Î ³¡³ª´Â º¤ÅͷΠǥÇöµÈ È£½ºÆ®ÀÇ ¶Ç´Ù¸¥ À̸§ÀÌ´Ù.
int h_addrtype
ÀͼÀº È£½ºÆ® ÁÖ¼ÒÀÇ ÇüÅÂÀÌ´Ù. ½ÇÁ¦ÀûÀ¸·Î, À̰ÍÀÇ °ªÀº Ç×»ó AF_INETÀÌ´Ù. ¿ø·¡ ´Ù¸¥ Á¾·áÀÇ ÁÖ¼Òµµ ÀÎÅÍ³Ý ÁÖ¼Òó·³ µ¥ÀÌÅͺ£À̽º ¾È¿¡ Ç¥ÇöµÉ ¼ö ÀÖ´Ù. ¸¸¾à ±×·¸°Ô ÇÑ´Ù¸é, ´ç½ÅÀº ÀÌ Çʵ忡 AF_INETÀÌ ¾Æ´Ñ ¾î¶² °ªÀ» ã¾Æ¾ß ÇÑ´Ù. 11.3[¼ÒÄÏ ÁÖ¼Òµé] 150ÂÊÀ» º¸¶ó.
int h_length
À̰ÍÀº °¢ ÁÖ¼ÒÀÇ ¹ÙÀÌÆ® ±æÀÌ´Ù.
char **h_addr_list
À̰ÍÀº È£½ºÆ®ÀÇ ÁÖ¼ÒµéÀÇ º¤ÅÍÀÌ´Ù. (È£½ºÆ®µéÀº ´ÙÁß ³×Æ®¿öÅ©¿¡ ¿¬°áµÇ°í °¢°¢ ¿©·¯°³ÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ °¡Áø´Ù´Â °ÍÀ» ȸ»óÇ϶ó) º¤ÅÍ´Â ³ÎÆ÷ÀÎÅÍ·Î Á¾·áµÈ´Ù.
char *h_addr
À̰ÍÀº h_addr_list[0]°ú µ¿ÀǾîÀÌ´Ù. ´Ù¸¥ ¸»·Î, À̰ÍÀº ù ¹øÂ° È£½ºÆ® ÁÖ¼ÒÀÌ´Ù.
È£½ºÆ® µ¥ÀÌÅͺ£À̽º°¡ °í·ÁµÇ´Â °Í°ú´Â ´Þ¸®, °¢ ÁÖ¼Ò´Â h_length ¹ÙÀÌÆ® ±æÀÌÀÇ ¸Þ¸ð¸® ºí·ÏÀÌ ´Ù. ±×·¯³ª ´Ù¸¥ ¹®¸Æ¿¡¼, ±×°ÍµéÀº, ´ç½ÅÀÌ À̰ÍÀ» in_addr ¶Ç´Â unsigned long int·Î º¯È¯ÇÒ ¼ö ÀÖ´Â ¾Ï½ÃÀûÀÎ °¡Á¤ÀÌ´Ù. struct hostent ±¸Á¶Ã¼ÀÇ È£½ºÆ® ÁÖ¼ÒµéÀº Ç×»ó ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î ÁÖ¾îÁø´Ù. 11.5.5Àý [¹ÙÀÌÆ® ¼ø¼] 161ÂÊÀ» º¸¶ó.
´ç½ÅÀº ƯÁ¤ÇÑ È£½ºÆ®¿¡ °üÇÑ Á¤º¸¸¦ ã±â À§ÇØ È£½ºÆ® µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇÏ·Á¸é gethostbyname ¶Ç´Â gethostbyaddr¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±× Á¤º¸´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¿¡ ¹ÝȯµÈ´Ù. ¸¸¾à ´ç½Å ÀÌ ±×°ÍÀ» È£Ãâ·Î ºÎÅÍ ÀúÀåÇϱâ À§Çؼ´Â Á¤º¸¸¦ º¹»çÇØ¾ß ÇÑ´Ù.
struct hostent * gethostbyname (const char *name) ÇÔ¼ö
gethostbynameÇÔ¼ö´Â nameÀ¸·Î À̸§Áö¾îÁø È£½ºÆ®¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à °Ë»ö¿¡ ½ÇÆÐÇÏ ¿´À¸¸é, ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
struct hostent * gethostbyaddr (const char *addr, int length, int format) ÇÔ¼ö
gethostbyaddrÇÔ¼ö´Â ÀÎÅÍ³Ý ÁÖ¼Ò addrÀÇ È£½ºÆ®¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ÀμöÀÇ length´Â addr ÁÖ ¼ÒÀÇ (¹ÙÀÌÆ® ´ÜÀ§ÀÇ)Å©±âÀÌ´Ù. format´Â ÁÖ¼ÒÇü½ÄÀ» ¸í½ÃÇÑ´Ù. Áï ÀÎÅÍ³Ý ÁÖ¼Ò¶ó¸é AF_INET°ªÀ¸ ·Î ¸í½ÃÇÏ¸é µÈ´Ù. ¸¸¾à °Ë»ö¿¡ ½ÇÆÐ¸¦ Çϸé, gethostbyaddr´Â ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
¸¸¾à gethostbyname ¶Ç´Â gethostbyaddrÀ» ÀÌ¿ëÇÑ À̸§°Ë»öÀÌ ½ÇÆÐÇϸé, ´ç½ÅÀº º¯¼öh_errnoÀÇ °ªÀ» »ìÆìº¸°í ±× ¿øÀÎÀ» ãÀ»¼ö ÀÖ´Ù. (±×°ÍÀº ±×·¯ÇÑ ÇÔ¼ö°¡ errno¸¦ ¼¼ÆÃÇϵµ·Ï ´õ ±ò²ûÇÏ°Ô ¼³°èµÇ¾î ÀÖ´Ù. ±×·¯³ª h_errnoÀÇ »ç¿ëÀº ´Ù¸¥ ½Ã½ºÅÛ¿¡ ´ëÇØ ȣȯ¼º ÀÖ°Ô µÇ¾î ÀÖ´Ù.) h_erro»ç¿ë Çϱâ Àü¿¡, ´ç½ÅÀº ´ÙÀ½°ú °°ÀÌ ±×°ÍÀ» ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù.
extern int h_errno;
¾Æ·¡´Â h_errno¾È¿¡¼ ãÀ»¼ö ÀÖ´Â errorÄÚµåµéÀÌ´Ù:
HOST_NOT_FOUND
¾î¶² È£½ºÆ®°¡ data base¾È¿¡ ¾ø´Ù.
TRY_AGAIN
ÀÌ »óÅ´ ³×ÀÓ¼¹ö¿¡ ¿¬°áµÇÁö ¾ÊÀ» ¶§ ¹ß»ýÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ ³ªÁß¿¡ ´Ù½Ã ½ÃµµÇÑ´Ù¸é, ¼º°øÇÒ ¼ö µµ ÀÖ´Ù.
NO_RECOVERY
º¹±¸ÇÒ¼ö ¾ø´Â ¿¡·¯ ¹ß»ý.
NO_ADDRESS
È£½ºÆ® µ¥ÀÌÅͺ£À̽º´Â À̸§¿¡ ´ëÇÑ Ç׸ñÀ» Æ÷ÇÔÇϳª, ±×°ÍÀº ÀûÇÕÇÑ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ °¡ÁöÁö ¾Ê¾Ò´Ù.
´ç½ÅÀº ¶ÇÇÑ sethostent,gethostent,endhostnet¸¦ »ç¿ëÇÏ¿© ÇÑ ¹ø¿¡ ÇÑ Ç׸ñ¾¿ Àüü È£½ºÆ® µ¥ÀÌ Åͺ£À̽º¸¦ ÁÖ¿í »ìÆìº»´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµéÀ» »ç¿ëÇÒ ¶§´Â ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍµéÀº ÀçÁøÀÔ ¼ºÀ» °¡ÁöÁö ¾Ê±â ¶§¹®ÀÌ´Ù.(Áï, ½ºÄÉÁìÀ» Á¡À¯ÇÑ´Ù)
void sethostent (int stayopen) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅͺ£À̽º¸¦ »ìÆìº¸´Â °ÍÀ» ½ÃÀÛÇϱâ À§Çؼ È£½ºÆ® µ¥ÀÌÅͺ£À̽º¸¦ ¿¬´Ù. ´ç½ÅÀº Ç׸ñµéÀ» Àбâ À§ÇØ ±×·¯°í ³ª¼ gethostent¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ¸¸¾à stayopenÀμö°¡ 0ÀÌ ¾Æ´Ï¸é, ´Ù À½À¸·Î gethostbyname ¶Ç´Â gethostbyaddr¸¦ È£ÃâÇÏ´Â °ÍÀÌ µ¥ÀÌÅͺ£À̽º¸¦ ´ÝÁö ¾Êµµ·Ï (±×°Íµé ÀÌ ±×·¡¾ß ÇÏ´Â °Íó·³) À̰ÍÀº Ç÷¡±×¸¦ ¼¼Æ®ÇÑ´Ù.
struct hostent * gethostent () ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â È£½ºÆ® µ¥ÀÌÅͺ£À̽º ¾ÈÀÇ ´ÙÀ½ Ç׸ñÀ» ¹ÝȯÇÑ´Ù. ¸¸¾à ´õ ÀÌ»ó Ç׸ñÀÌ ¾øÀ¸¸é, ³Î Æ÷ÀÎÅÍ ¸¦ ¸®ÅÏÇÑ´Ù.
void endhostent () ÇÔ¼ö
ÇÔ¼ö´Â È£½ºÆ® µ¥ÀÌÅÍ º£À̽º¸¦ ´Ý´Â´Ù.
11.5.3 ÀÎÅÍ³Ý Æ÷Æ®
ÀÎÅÍ³Ý À̸§°ø°£¿¡¼ÀÇ ¼ÒÄÏÁÖ¼Ò´Â, ÀåÄ¡ÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò¿¡ Ãß°¡ÀûÀ¸·Î ÁÖ¾îÁø ÀåÄ¡ÀÇ ¼ÒÄÏÀ» ±¸º° ÇÏ´Â Æ÷Æ®¹øÈ£·Î ±¸¼ºµÈ´Ù. Æ÷Æ®¹øÈ£´Â 0¿¡¼ 65535¹ø±îÁöÀÇ ¹üÀ§ÀÌ´Ù. IPPORT_RESERVEDº¸´Ù ÀÛÀº Æ÷Æ®¹øÈ£´Â Ç¥Áؼ¹ö¿¡¼ finger³ª telnet°ú °°Àº °ÍÀ» À§ÇØ ¿¹¾àµÇ¾î ÀÖ´Ù. ½Ã½ºÅÛ ³»ºÎ¿¡ ÀÌ·¯ÇÑ °ÍµéÀ» À¯ÁöÇϰí ÀÖ´Â µ¥ÀÌÅͺ£À̽º°¡ ÀÖ°í, ´ç½ÅÀº getservbynameÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¼ºñ½º À̸§°ú Æ÷Æ®¹øÈ£ÀÇ ¸ÊÀ» ¸¸µé ¼ö ÀÖ´Ù.; 11.5.4Àý [¼ºñ½º µ¥ÀÌÅͺ£À̽º], 160ÂÊÀ» º¸¶ó.
¸¸¾à µ¥ÀÌÅͺ£À̽º¾È¿¡ Á¤ÀÇµÈ Ç¥ÁØ ÁßÀÇ Çϳª°¡ ¾Æ´Ñ ¼¹ö¸¦ ÀÛ¼ºÇÏ·Á¸é, ±×°ÍÀ» À§ÇÑ Æ÷Æ®¹øÈ£ ¸¦ ¼±ÅÃÇØ¾ß ÇÑ´Ù. IPPORT_USERRESERVED º¸´Ù ´õ Å« ¼ýÀÚ¸¦ »ç¿ëÇ϶ó. ¾î¶² ¹øÈ£µéÀº ¼¹ö µéÀ» À§ÇØ ¿¹¾àµÇ¾î ÀÖ°í ½Ã½ºÅÛ¿¡ ÀÇÇØ ÀÚµ¿À¸·Î »ý¼ºµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ´Ù¸¥ »ç¿ëÀڵ鿡 ÀÇÇÑ ¼ ¹ö»ç¿ë°úÀÇ Ãæµ¹À» ÇÇÇÏ´Â °ÍÀº ´ç½Å¿¡°Ô ´Þ·È´Ù.
´ç½ÅÀÌ ±×°ÍÀÇ ÁÖ¼Ò¸¦ ¸í½ÃÇÏÁö ¾Ê°í ¼ÒÄÏÀ» »ç¿ëÇÒ ¶§, ½Ã½ºÅÛÀº Æ÷Æ®¹øÈ£¸¦ Çϳª »ý¼ºÇÑ´Ù. ÀÌ ¹øÈ£´Â IPPORT_RESERVED¿Í IPPORT_ USERRESERVED»çÀÌÀÇ °ªÀÌ´Ù.
ÀÎÅͳݿ¡¼, °°Àº ¼ÒÄÏÁÖ¼Ò(È£½ºÆ® ÁÖ¼Ò + Æ÷Æ®ÁÖ¼Ò)·Î Åë½ÅÀ» ½ÃµµÇÏÁö ¾Ê´Â´Ù¸é, °°Àº Æ÷Æ®¹øÈ£ ·Î µÎ °³ÀÇ ´Ù¸¥ ¼ÒÄÏÀ» °¡Áö´Â °ÍÀº ½ÇÁ¦·Î Àû´çÇÑ ¹æ¹ýÀÌ´Ù. »óÀ§ÇÁ·ÎÅäÄÝÀÌ ±×°ÍÀ» ¿ä±¸ÇÒ¶§, Ư º°ÇÑ »óȲÀ» ±â´ëÇÏ°í °°Àº Æ÷Æ®¹øÈ£¸¦ º¹»çÇÏÁö ¸»¾Æ¶ó. º¸Åë, ½Ã½ºÅÛÀº ±×·¯ÇÑ ÀÏÀ» ¼öÇàÇÏÁö ¾Ê À» °ÍÀÌ´Ù. bind´Â º¸Åë ´Ù¸¥ Æ÷Æ®¹øÈ£¸¦ ¿ä±¸ÇÑ´Ù. Æ÷Æ®¹øÈ£¸¦ ´Ù½Ã »ç¿ëÇϱâ À§Çؼ´Â, ¼ÒÄÏ¿É¼Ç SO_REUSEADDR¸¦ ¼¼Æ®Ç϶ó. 11.11.2Àý [¼ÒÄÏ-¼öÁØ ¿É¼Ç] 181ÂÊÀ» º¸¶ó.
´ÙÀ½ ¸ÅÅ©·ÎµéÀº 'netinet/in.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
int IPPORT__RESERVED ¸ÅÅ©·Î
IPPORT_RESERVED º¸´Ù ÀÛÀº °ªÀÇ Æ÷Æ®´Â ¼öÆÛÀ¯Àú¿ëÀ¸·Î ¿¹¾àµÇ¾î ÀÖ´Ù.
int IPPORT__USERRESERVED ¸ÅÅ©·Î
¸í¹éÈ÷ »ç¿ëÇϱâ À§ÇØ ¿¹¾àµÈ, IPPORT_USERRESERVEDº¸´Ù Å©°Å³ª °°Àº Æ÷Æ®ÀÌ´Ù. ±×°ÍµéÀº º¸ Åë ÀÚµ¿À¸·Î ÇÒ´çµÈ´Ù.
11.5.4 ¼ºñ½º µ¥ÀÌÅͺ£À̽º
À¯¸íÇÑ ¼ºñ½ºÀÇ °æ·Î¸¦ À¯ÁöÇÏ´Â µ¥ÀÌÅͺ£À̽º´Â º¸Åë '/etc/services'ÆÄÀÏÀ̰ųª ³×ÀÓ¼¹öÀÇ µ¿µî ÇÑ ÆÄÀÏÀÌ´Ù. ÀÌ ¼ºñ½º µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâ À§ÇØ 'netdb.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Â ´ÙÀ½ À¯Æ¿¸®Æ¼ µéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
struct servent ÀÚ·áÇü
ÀÌ ÀÚ·áÇüÀº ¼ºñ½º µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍÀÇ Ç׸ñ¿¡ °üÇÑ Á¤º¸¸¦ ³ªÅ¸³½´Ù.
char *s_name
À̰ÍÀº ¼ºñ½ºÀÇ "°ø½ÄÀû"ÀÎ À̸§ÀÌ´Ù.
char **s_aliases
¹®ÀÚ¿ÀÇ ¹è¿·Î Ç¥ÇöµÈ ¼ºñ½ºÀÇ ¶Ç´Ù¸¥ À̸§µéÀÌ´Ù. ÀÌ ¹è¿Àº ¸¶Áö¸·¿¡ ³ÎÆ÷ÀÎÅͰ¡ µé¾î°£´Ù.
int s_port
À̰ÍÀº ¼ºñ½ºÀÇ Æ÷Æ® ¹øÈ£ÀÌ´Ù. Æ÷Æ®¹øÈ£´Â ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î µÇ¾î ÀÖ´Ù. ; 11.5.5Àý [¹ÙÀÌÆ® ¼ø¼] 161ÆäÀÌÁö¸¦ º¸¶ó.
char *s_proto
À̰ÍÀº ÀÌ ¼ºñ½º¿Í »ç¿ëµÇ´Â ÇÁ·ÎÅäÄÝÀÇ À̸§ÀÌ´Ù. 11.5.6Àý [ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º] 162ÂÊÀ» º¸ ¶ó.
ƯÁ¤ÇÑ ¼ºñ½º¿¡ °üÇÑ Á¤º¸¸¦ ¾òÀ¸·Á¸é, getservbynameÀ̳ª getservby port ÇÔ¼ö¸¦ »ç¿ëÇ϶ó. ÀÌ Á¤º¸´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¾ÈÀ¸·Î ¹ÝȯµÈ´Ù. Áï ±×°ÍÀ» ¿©·¯¹ø È£ÃâÇÏ´Â °ÍÀ¸·Î ºÎÅÍ º¸È£ÇÏ·Á ¸é ±× Á¤º¸¸¦ º¹»çÇØ ³õ¾Æ¾ß¸¸ ÇÑ´Ù.
struct servent * getservbyname (const char *name, const char *proto) ÇÔ¼ö
getservbynameÇÔ¼ö´Â nameÀ̶ó°í proto¶ó´Â ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇϰí À̸§Áö¾îÁø ¼ºñ½º¿¡ °üÇÑ Á¤ º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ±×·¯ÇÑ ¼ºñ½º¸¦ ãÁö ¸øÇϸé, ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
ÀÌ ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®µé»Ó¸¸ ¾Æ´Ï¶ó ¼¹öµé¿¡¼µµ À¯¿ëÇÏ´Ù. ¼¹ö¿¡¼´Â µè°íÀÚ ÇÒ ¶§ ¾î¶² Æ÷Æ®¸¦ »ç¿ëÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÒ ¶§, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. (µè´Â °Í¿¡ °üÇÏ¿©¼´Â 11.8.2Àý[µè±â], 167ÂÊÀ» º¸ ¶ó)
struct servent * getservbyport (int port, const char *proto) ÇÔ¼ö
getservbyportÇÔ¼ö´Â protoÇÁ·ÎÅäÄÝÀ» »ç¿ëÇϰí port¶ó´Â Æ÷Æ®¸¦ »ç¿ëÇÏ´Â ¼ºñ½º¿¡ °üÇÑ Á¤º¸¸¦ ¹Ý ȯÇÑ´Ù. ´ç½ÅÀº ¶ÇÇÑ setservent, getservent,endservent¸¦ »ç¿ëÇÏ¿© ¼ºñ½º µ¥ÀÌÅͺ£À̽º¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ÇÔ¼öµéÀº ÀçÁøÀÔ¼ºÀ» °¡ÁöÁö ¾Ê±â ¶§¹®¿¡, »ç¿ëÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÑ´Ù.
void setservent (int stayopen) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ´ç½ÅÀÌ Á¶»çÇÏ·Á´Â ¼ºñ½º µ¥ÀÌÅͺ£À̽º¸¦ ¿¬´Ù.
¸¸¾à stayopen Àμö°¡ 0ÀÌ ¾Æ´Ï¸é, getservbyname¶Ç´Â getservbyport¸¦ ´ÙÀ½¿¡ È£ÃâÀ» ÇÏ¿´À»¶§ µ¥ ÀÌÅͺ£À̽º¸¦ ´ÝÁö ¾Êµµ·Ï(º¸ÅëÀº ´Ý´Â´Ù), Ç÷¡±×¸¦ ¼¼Æ®ÇÑ´Ù. ¿©·¯¹øÀÇ È£ÃâÀÌ µ¥ÀÌÅͺ£À̽º¸¦ ¿© ·¯¹ø ¿Áö ¾Êµµ·Ï ÇÒ ¶§, À̰ÍÀº ´õ¿í È¿À²ÀûÀÌ´Ù.
struct servent * getservent (void) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼ºñ½º µ¥ÀÌÅͺ£À̽º¾ÈÀÇ ´ÙÀ½ Ç׸ñÀ» ¹ÝȯÇÑ´Ù. ¸¸¾à ´õ ÀÌ»óÀÇ Ç׸ñÀÌ ¾øÀ¸¸é, ³ÎÆ÷ÀÎ Å͸¦ ¹ÝȯÇÑ´Ù.
void endservent (void) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼ºñ½º µ¥ÀÌÅͺ£À̽º¸¦ ´Ý´Â´Ù.
11.5.5 ¹ÙÀÌÆ®¼ø¼ º¯È¯
ÄÄÇ»ÅÍÀÇ Á¾·ù°¡ Ʋ¸®¸é, ÇÑ ¿öµå ³»¿¡¼ ¹ÙÀÌÆ®ÀÇ ¼ø¼°¡ Ʋ¸®°Ô »ç¿ë µÉ ¼ö ÀÖ´Ù. ¾î¶² ÄÄÇ»Å͵é Àº ¿öµå¾È¿¡ »óÀ§ ¹ÙÀÌÆ®°¡ ¸ÕÀú ¿À±âµµ Çϰí (À̸¦ "Å« Á¾°áÀÚ(big-endian)"¶ó ºÎ¸¥´Ù), ´Ù¸¥ °Íµé Àº »óÀ§ ¹ÙÀÌÆ®°¡ ³ªÁß¿¡ ¿À±âµµ ÇÑ´Ù.(À̸¦ "ÀÛÀº Á¾°áÀÚ(little-endian)"¶ó ÇÑ´Ù)
´Ù¸¥ ¹ÙÀÌÆ®¼ø¼¸¦ »ç¿ëÇÏ´Â ÀåÄ¡µéÀÌ Åë½ÅÇϱâ À§ÇØ, ÀÎÅÍ³Ý ÇÁ·ÎÅäÄݵéÀº ³×Æ®¿öÅ© »ó¿¡¼ Àü¼ÛµÇ ´Â µ¥ÀÌÅ͸¦ À§ÇØ ±ÔÁ¤µÈ ¹ÙÀÌÆ®¼ø¼¸¦ ¸í½ÃÇϰí ÀÖ´Ù.
ÀÎÅÍ³Ý ¼ÒÄÏ ¿¬°áÀ» ¼³Á¤ÇÒ ¶§, ´ç½ÅÀº sockaddr_in±¸Á¶Ã¼ÀÇ sin_port¿Í sin_addr¸â¹ö¸¦ ³×Æ®¿öÅ© ¹ÙÀÌÆ®¼ø¼·Î Ç¥ÇöÇØ¾ß¸¸ ÇÑ´Ù. ¼ÒÄÏÀ» ÅëÇØ Àü¼ÛµÇ´Â Á¤¼ö µ¥ÀÌÅ͸¦ ÄÚµùÇÒ ¶§ ¿ª½Ã ±×°ÍÀ» ³×Æ®¿ö Å© ¹ÙÀÌÆ® ¼ø¼·Î º¯È¯ÇØ¾ß ÇÑ´Ù. ¸¸¾à ±×·¸°Ô ÇÏÁö ¾Ê´Â´Ù¸é, ÇÁ·Î±×·¥Àº ´Ù¸¥ Á¾·ùÀÇ ÀåÄ¡¿Í Åë½Å À» Çϴµ¥ ½ÇÆÐÇÒ °ÍÀÌ´Ù.
Æ÷Æ®¹øÈ£³ª È£½ºÆ® ÁÖ¼Ò¸¦ ¾ò±â À§ÇØ getservbyname, gethostbyname, inet_addr¸¦ »ç¿ëÇÑ´Ù¸é, »ç ¿ëµÇ´Â °ªµéÀº ÀÌ¹Ì ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼·Î µÇ¾î ÀÖ´Â °ÍÀÌ´Ù. ´ç½ÅÀº ±×°ÍµéÀ» sockaddr_in¿¡ Á÷ Á¢ º¹»çÇÒ ¼ö ÀÖ´Ù.
±×·¸Áö ¾ÊÀº °æ¿ì, °ªµéÀ» Á¤È®È÷ º¯È¯ÇÏÁö ¾ÊÀ¸¸é ¾ÈµÈ´Ù. sin_port¸â¹ö·Î »ç¿ëÇϱâ À§ÇØ htons¿Í ntohs¸¦ »ç¿ëÇÏ¿© °ªµéÀ» º¯È¯Ç϶ó. sin_addr¸â¹ö·Î »ç¿ëÇϱâ À§ÇØ htonl°ú ntohl¸¦ »ç¿ëÇÏ¿© °ªµéÀ» º¯È¯Ç϶ó. (struct in_addrÀº unsigned long int°ú °°Àº °ÍÀÓÀ» ±â¾ïÇ϶ó) ÀÌ·¯ÇÑ ÇÔ¼öµéÀº 'netinet/in.h'¾È¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
unsigned short inthtons (unsigned short int hostshort) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â È£½ºÆ® ¹ÙÀÌÆ®¼ø¼·Î µÈ shortÇü Á¤¼ö hostshort¸¦ ³×Æ®¿öÅ©¹ÙÀÌÆ® ¼ø¼·Î º¯È¯ÇÑ´Ù.
unsigned short int ntohs (unsigned short int netshort) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ³×Æ®¿öÅ© ¹ÙÀÌÆ®¼ø¼·Î µÈ shortÇü Á¤¼ö netshort¸¦ È£½ºÆ® ¹ÙÀÌÆ®¼ø¼·Î º¯È¯ÇÑ´Ù.
unsigned long int htonl (unsigned long int hostlong ) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â È£½ºÆ® ¹ÙÀÌÆ®¼ø¼·ÎµÈ longÇü Á¤¼ö hostlongÀ» ³×Æ®¿öÅ© ¹ÙÀÌÆ®¼ø¼·Î º¯È¯ÇÑ´Ù.
unsigned long int ntohl (unsigned long int netlong ) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ³×Æ®¿öÅ© ¹ÙÀÌÆ®¼ø¼·Î µÈ longÇü Á¤¼ö netlongÀ» È£½ºÆ® ¹ÙÀÌÆ®¼ø¼·Î º¯È¯ÇÑ´Ù.
11.5.6 ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º
¼ÒÄÏ¿¡¼ »ç¿ëµÇ´Â Åë½Å ÇÁ·ÎÅäÄÝÀº ¾î¶»°Ô µ¥ÀÌÅ͸¦ ±³È¯ÇÒ °ÍÀΰ¡¿¡ ´ëÇÑ Àú¼öÁØ ¼¼ºÎ»çÇ×À» Á¦ ¾îÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÁ·ÎÅäÄÝÀº, Àü¼Û»óÀÇ ¿¡·¯°ËÃâÀ» À§ÇÑ °Ë»çÇÕ°è(checksum)°°Àº °ÍÀ̳ª, ¸Þ½ÃÁö ÀÇ °æ·Î¼³Á¤ ¸í·É °°Àº °ÍµéÀ» ±¸ÇöÇÑ´Ù. ÀÏ¹Ý »ç¿ëÀÚ ÇÁ·Î±×·¥µéÀº ÀÌ·¯ÇÑ ¼¼ºÎ»çÇ׵鿡 ´ëÇØ¼ Á÷Á¢ÀûÀÎ ¿µÇâÀ» ¹ÞÁö´Â ¾Ê´Â´Ù.
ÀÎÅÍ³Ý À̸§°ø°£ÀÇ ±âº» Åë½Å ÇÁ·ÎÅäÄÝÀº Åë½Å½ºÅ¸ÀÏ¿¡ ÀÇÁ¸ÇÑ´Ù. ½ºÆ®¸² Åë½ÅÀÇ ±âº» ÇÁ·ÎÅäÄÝÀº TCP("Àü¼Û Á¦¾î ÇÁ·ÎÅäÄÝ")ÀÌ´Ù. µ¥ÀÌÅͱ׷¥ Åë½ÅÀÇ ±âº» ÇÁ·ÎÅäÄÝÀº UDP("À¯Àú µ¥ÀÌÅͱ׷¥ ÇÁ·ÎÅä ÄÝ")ÀÌ´Ù. ½Å·Ú¼º ÀÖ´Â µ¥ÀÌÅͱ׷¥ Åë½ÅÀÇ ±âº» ÇÁ·ÎÅäÄÝÀº RDP("½Å·Ú¼º ÀÖ´Â µ¥ÀÌÅͱ׷¥ ÇÁ·ÎÅäÄÝ ")ÀÌ´Ù. ´ç½ÅÀº ¾Æ¸¶ °ÅÀÇ ´ëºÎºÐ ±âº» ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.
ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝÀº ÀϹÝÀûÀ¸·Î ¼ýÀÚ ´ë½Å À̸§À¸·Î ¸í½ÃµÈ´Ù. È£½ºÆ®°¡ ¾Ë°í ÀÖ´Â ³×Æ®¿öÅ© ÇÁ·ÎÅä ÄÝÀº µ¥ÀÌÅͺ£À̽º ¾È¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. À̰ÍÀº º¸Åë '/etc/protocols'ÆÄÀÏÀÌ¿¡¼ ¾ò¾îÁö°Å³ª , ³×ÀÓ¼ ¹ö¿¡ ÀÇÇØ µ¿µîÇÏ°Ô Á¦°øµÉ ¼ö ÀÖ´Ù. ´ç½ÅÀº getprotobynameÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º³»¿¡¼ ÇÁ·ÎÅäÄÝ À̸§¿¡ ¿¬°èµÈ ÇÁ·ÎÅäÄÝ ¹øÈ£¸¦ ã¾Æ ³¾ ¼ö ÀÖ´Ù.
¿©±â¿¡ ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâ À§ÇÑ À¯Æ¿¸®Æ¼µéÀÇ ÀÚ¼¼ÇÑ Á¤Àǰ¡ ÀÖ´Ù. À̰͵éÀº 'netdb.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
struct protoent ÀÚ·áÇü
ÀÌ ÀÚ·áÇüÀº ³×Æ®¿öÅ© ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽ºÀÇ Ç׸ñµé¸¦ Ç¥ÇöÇϴµ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº ´ÙÀ½ ¸â¹ö¸¦ °¡Áø´Ù.
char *p_name
À̰ÍÀº ÇÁ·ÎÅäÄÝÀÇ °ø½ÄÀûÀÎ À̸§ÀÌ´Ù.
char **p_aliases
À̰͵éÀº ÇÁ·ÎÅäÄÝÀÇ ¶Ç´Ù¸¥ À̸§µéÀÌ´Ù. ¹®ÀÚ¿ÀÇ ¹è¿·Î µÇ¾î ÀÖÀ¸¸ç, ¹è¿ÀÇ ¸¶Áö¸· ¿ä¼Ò´Â ³ÎÆ÷ ÀÎÅÍÀÌ´Ù.
int p_proto
À̰ÍÀº (È£½ºÆ® ¹ÙÀÌÆ®¼ø¼·Î µÈ) ÇÁ·ÎÅäÄÝ ¹øÈ£ÀÌ´Ù. ¼ÒÄÏÀÇ protocolÀμö·Î ÀÌ ¸â¹ö¸¦ »ç¿ëÇ϶ó
±¸Ã¼ÀûÀÎ ÇÁ·ÎÅäÄÝ¿¡ °üÇÏ¿© ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇϱâ À§ÇØ getprotobyname°ú getprotobynumber¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¿¡ Á¤º¸°¡ ¹ÝȯµÈ´Ù. ¿©·¯¹ø È£ÃâµÇ´Â °ÍÀ¸·ÎºÎÅÍ Á¤º¸¸¦ º¸È£Çϱâ À§ÇØ ±×°ÍÀ» º¹»çÇØ¾ß ³õ¾Æ¾ß ÇÑ´Ù.
struct protoent * getprotobyname (const char *name) ÇÔ¼ö
getprotobynameÇÔ¼ö´Â nameÀ̶ó´Â À̸§ÀÇ ³×Æ®¿öÅ©ÇÁ·ÎÅäÄÝ¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à °°Àº À̸§ÀÇ ÇÁ·ÎÅäÄÝÀÌ ¾øÀ¸¸é, ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
struct protoent * getprotobynumber (int protocol) ÇÔ¼ö
getprotobynumberÇÔ¼ö´Â protocolÀ̶ó´Â ¼ýÀÚ¸¦ °¡Áø ³×Æ®¿öÅ© ÇÁ·ÎÅäÄÝ¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ÀÌ·¯ÇÑ ÇÁ·ÎÅäÄÝÀÌ ¾ø´Ù¸é ³Î Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
setprotoent, getprotoent, endprotoent¸¦ »ç¿ëÇÏ¿© Àüü ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º¸¦ ÇÑ ¹ø¿¡ ÇÑ ÇÁ·ÎÅä Äݾ¿ Á¶»çÇÒ ¼ö ÀÖ´Ù. À̵é ÇÔ¼ö´Â ÀçÁøÀÔ¼ºÀ» °¡ÁöÁö ¾Ê±â ¶§¹®¿¡ ÁÖÀÇÇØ¼ »ç¿ëÇØ¾ß ÇÑ´Ù.
void setprotoent (int stayopen) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â °Ë»öÀ» À§ÇØ ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º¸¦ ¿¬´Ù. ¸¸¾à stayopenÀμö°¡ 0ÀÌ ¾Æ´Ï¸é, getprotobyname ¶Ç´Â getproto-bynumberÀÇ È£ÃâÀÌ µ¥ÀÌÅͺ£À̽º¸¦ (º¸Åë ´Ý´Âµ¥) ´ÝÁö ¾Êµµ·Ï Çà ·¡±×¸¦ ¼¼Æ®ÇÑ´Ù. À̰ÍÀº ¿©·¯¹øÀÇ È£Ãâ·Î µ¥ÀÌÅͺ£À̽º°¡ ¿©·¯¹ø ¿¸®Áö ¾Êµµ·Ï Çϴµ¥ ´õ¿í À¯¿ë ÇÏ´Ù
struct protoent * getprotoent (void) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽ºÀÇ ´ÙÀ½ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ´õ ÀÌ»óÀÇ Ç׸ñÀÌ ¾øÀ¸¸é ³ÎÆ÷ÀÎ Å͸¦ ¹ÝȯÇÑ´Ù.
void endprotoent (void) Function
ÀÌ ÇÔ¼ö´Â ÇÁ·ÎÅäÄÝ µ¥ÀÌÅͺ£À̽º¸¦ ´Ý´Â´Ù.
11.5.7 ÀÎÅÍ³Ý ¼ÒÄÏ ¿¹Á¦
¿©±â¿¡ ÀÎÅÍ³Ý À̸§°ø°£ ¾È¿¡ ¼ÒÄÏÀ» ¸¸µé°í À̸§Áþ´Â ¹æ¹ýÀ» º¸¿©ÁÖ´Â ¿¹Á¦°¡ ÀÖ´Ù. ÇÁ·Î±×·¥ÀÌ ¼ö ÇàµÇ´Â ÀåÄ¡¿¡ »õ·Î ¼ÒÄÏÀÌ ¸¸µé¾î Áø´Ù. ?;
ÀåÄ¡ÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ ã°í »ç¿ëÇÏ´Â °Í ´ë½Å, È£½ºÆ® ÁÖ¼Ò¿¡´Â INADDR_ANY¸¦ ¸í½ÃÇÏ¿´´Ù. ½Ã½º ÅÛÀº ÀåÄ¡ÀÇ ½ÇÁ¦ÁÖ¼Ò·Î ±×°ÍÀ» ´ëÄ¡ÇÑ´Ù.
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
int
make_socket (unsigned short int port)
{
int sock;
struct sockaddr_in name;
/* ¼ÒÄÏÀ» ¸¸µç´Ù */
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror ("socket");
exit (EXIT_FAILURE);
}
/* ¼ÒÄÏ¿¡ À̸§À» ÁØ´Ù */
name.sin_family= AF_INET;
name.sin_port = htons (port);
name.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
{
perror ("bind");
exit (EXIT_FAILURE);
}
return sock;
}
¿©±â¿¡ ¶Ç´Ù¸¥ ¿¹Á¦°¡ ÀÖ´Ù. À̰ÍÀº ÁÖ¾îÁø È£½ºÆ® À̸§¹®ÀÚ¿°ú Æ÷Æ®¹øÈ£¸¦ sockaddr_in±¸Á¶Ã¼¾È ¿¡ ¾î¶»°Ô ³Ö´Â Áö¸¦ º¸¿©ÁØ´Ù:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void
init_sockaddr (struct sockaddr_in *name, const char *hostname,
unsigned short int port)
{
struct hostent *hostinfo;
name->sin_family = AF_INET;
name->sin_port = htons (port);
hostinfo = gethostbyname (hostname);
if (hostinfo == NULL)
{
fprintf (stderr, "Unknown host %s.\n", hostname);
exit (EXIT_FAILURE);
}
name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
}
11.6 ´Ù¸§ À̸§°ø°£µé
´Ù¸¥ À̸§°ø°£°ú ÇÁ·ÎÅäÄÝÆÐ¹Ð¸®µéµµ Áö¿øµÇÁö¸¸ º°·Î »ç¿ëµÇÁö ¾ÊÀ¸¹Ç·Î ¾ÆÁ÷ ¹®¼ÈµÇÁö ¾Ê¾Ò´Ù. PF_NS´Â Xerox ³×Æ®¿öÅ© ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÄÝ¿¡ °ü·ÃµÈ °ÍÀÌ´Ù. PF_ISO ´Â °³¹æ½Ã½ºÅÛ»óÈ£¿¬°á (OSI)¿¡ °ü·ÃµÈ °ÍÀÌ´Ù. PF_CCITT´Â CCITTÀÇ ÇÁ·ÎÅäÄݵ鿡 °ü·ÃµÈ °ÍÀÌ´Ù. 'socket.h'¿¡ ½ÇÁ¦·Î ±¸ÇöµÇÁö ¾ÊÀº ±âÈ£¿Í ´Ù¸¥ À̸§ÀÇ ÇÁ·ÎÅäÄÝÀÌ Á¤ÀǵǾî ÀÖ´Ù.
PF_IMPLINK´Â È£½ºÆ®¿Í ÀÎÅÍ³Ý ¸Þ½ÃÁö 󸮱â¿ÍÀÇ Åë½Å¿¡ »ç¿ëµÈ´Ù. ÀÌ¿¡ °üÇÑ Á¤º¸¿Í °¡²û »ç ¿ëµÇ´Â Áö¿ª °æ·Î¼³Á¤ ÇÁ·ÎÅäÄÝÀÎ PF_ROUTE¿¡ °üÇÏ¿©´Â (¹Ì·¡¿¡ ³ª¿Ã) GNU Hurd ManualÀ» º¸ ¶ó.
11.7 ¼ÒÄÏ ¿°í ´Ý±â
ÀÌ Àý¿¡¼´Â ¼ÒÄÏÀ» ¿°í ´Ù´Â ½ÇÁ¦ÀûÀÎ ¶óÀ̺귯¸® ÇÔ¼ö¿¡ °üÇÏ¿© ¼¼úÇÑ´Ù. ¸ðµç À̸§°ø°£°ú ¿¬ °á½ºÅ¸ÀÏ¿¡ ´ëÇØ °°Àº ÇÔ¼ö°¡ »ç¿ëµÈ´Ù.
11.7.1 ¼ÒÄÏ ¸¸µé±â
¼ÒÄÏÀ» ¸¸µé±â À§Çؼ´Â 'sys/socket.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Â ¼ÒÄÏÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
int socket (int namespace, int style, int protocol) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼ÒÄÏÀ» ¸¸µé°í Åë½Å½ºÅ¸ÀÏ styleÀ» ¸í½ÃÇÑ´Ù. Åë½Å½ºÅ¸ÀÏÀº 11.2Àý[Åë½Å½ºÅ¸ÀÏ],150ÂÊ¿¡ ¿ °ÅµÈ ¼ÒÄÏ ½ºÅ¸ÀÏÁß Çϳª¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. namespaceÀμö´Â À̸§°ø°£À» ¸í½ÃÇϰí, PF_FILEÀ̰гª PF_INETÀ̾î¾ß ÇÑ´Ù( 11.4Àý[ÆÄÀÏ À̸§°ø°£],153ÂÊ, 11.5Àý[ÀÎÅÍ³Ý À̸§°ø°£],155ÂÊÀ» º¸¶ó). protocolÀº ÇÁ·ÎÅäÄÝÀ» Á¤ÇÑ´Ù (11.1Àý [¼ÒÄϰ³³ä],149ÂÊÀ» º¸¶ó); protocol¿¡´Â º¸Åë 0ÀÌ »ç¿ëµÈ´Ù. socketÀ¸·ÎºÎÅÍÀÇ ¹Ýȯ°ªÀº »õ·Î¿î ¼ÒÄÏÀÇ ÆÄÀϼ¼úÀÚÀÌ´Ù. ¿¡·¯°¡ ¹ß»ýÇϸé -1ÀÌ ¹ÝȯµÈ´Ù. ´ÙÀ½ Àº ÀÌ ÇÔ¼ö°¡ Á¤ÀÇÇØ ³õÀº ¿¡·¯ »óȲ errnoÀÌ´Ù:
EPROTONOSUPPORT
The protocol or style is not supported by the namespace specified.
EMFILE ÇÁ·Î¼¼½º°¡ ÀÌ¹Ì ³Ê¹« ¸¹Àº ÆÄÀϼ¼úÀÚµéÀ» ¿¾î ³õ¾Ò´Ù.
ENFILE ½Ã½ºÅÛÀÌ ÀÌ¹Ì ³Ê¹« ¸¹Àº ÆÄÀϼ¼úÀÚµéÀ» ¿¾î ³õ¾Ò´Ù.
EACCESS ÇÁ·Î¼¼½º°¡ ¸í½ÃµÈ styleÀ̳ª protocol¿¡ ¸Â´Â ¼ÒÄÏÀ» ¸¸µé ¼ö ±ÇÇÑÀ» °®°í ÀÖÁö ¾Ê´Ù.
ENOBUFS ½Ã½ºÅÛ ³»ºÎ ¹öÆÛ °ø°£ÀÌ ºÎÁ·ÇÏ´Ù.
socket ÇÔ¼ö¿¡ ÀÇÇØ ¹ÝȯµÇ´Â ÆÄÀϼ¼úÀÚ´Â Àбâ¿Í ¾²±â ±â´É ¸ðµÎ¸¦ Áö¿øÇÑ´Ù. ±×·¯³ª ÆÄÀÌÇÁ °°Àº ¼ÒÄϵéÀº ÆÄÀÏ À§Ä¡¿¡ °üÇÑ µ¿ÀÛÀº ÇÏÁö ¸øÇÑ´Ù. socketÇÔ¼ö¸¦ ¾î¶»°Ô È£ÃâÇÏ´Â Áö¿¡ ´ëÇÑ ¿¹´Â 11.4 Àý [ÆÄÀÏ À̸§°ø°£],153ÂÊ, ¶Ç´Â 11.5.7Àý [Inet ¿¹Á¦],163ÂÊÀ» º¸¶ó.
11.7.2 ¼ÒÄÏ ´Ý±â
¼ÒÄÏÀÇ »ç¿ëÀÌ ³¡³ª¸é, °£´ÜÈ÷ ±× ÆÄÀϼ¼úÀÚ¸¦ closeÇÔ¼ö¸¦ ÀÌ¿ëÇØ ´ÝÀ¸¸é µÈ´Ù; 8.1Àý [ÆÄÀÏ ¿°í ´Ý±â], 103ÂÊÀ» º¸¶ó. ¸¸¾à ¿¬°áÀ» ÅëÇÏ¿© Àü¼ÛµÇ±â¸¦ ±â´Ù¸®´Â µ¥ÀÌÅͰ¡ ¿©ÀüÈ÷ ÀÖÀ¸¸é, º¸Åë close ´Â ÀÌ Àü¼ÛÀÌ ¿Ï·áµÇµµ·Ï ½ÃµµÇÑ´Ù. SO_LINGER¼ÒÄÏ ¿É¼ÇÀ» »ç¿ëÇÏ¿© ½Ã°£Á¦ÇÑ Áֱ⸦ ¸í½ÃÇØ ÁÖ ¸é, ÀÌ °úÁ¤À» Á¦¾îÇÒ ¼ö ÀÖ´Ù. 11.11Àý [¼ÒÄÏ ¿É¼Ç],180ÂÊÀ» º¸¶ó.
´ç½ÅÀº 'sys/socket.h'¿¡ ¼¼úµÇ¾î ÀÖ´Â shutdownÀ» È£ÃâÇÏ¹Ç·Î½á ¿¬°áÇÏÀÇ ¼Û½Å¸¸ ¶Ç´Â ¼ö½Å¸¸À» Á¾·á½Ãų ¼ö ÀÖ´Ù.
int shutdown (int socket, int how ) ÇÔ¼ö
shutdownÇÔ¼ö´Â socketÀ̶ó´Â ¼ÒÄÏÀÇ ¿¬°áÀ» Á¾·á½ÃŲ´Ù. howÀμö´Â ¾î¶² ±â´ÉÀ» ¼öÇàÇÒ °ÍÀΰ¡¸¦ ¸í½ÃÇÑ´Ù.
0 ÀÌ ¼ÒÄÏÀ¸·ÎºÎÅÍ µ¥ÀÌÅÍ ¼ö½ÅÀ» Áß´ÜÇÑ´Ù. ¸¸¾à ´õ ÀÌ»óÀÇ µ¥ÀÌÅͰ¡ µµÂøÇϸé, ±×°ÍÀ» ¹«½ÃÇÑ´Ù.
1 ÀÌ ¼ÒÄÏÀ¸·ÎÀÇ Àü¼ÛÀ» Áß´ÜÇÑ´Ù. º¸³»±â À§ÇØ ´ë±âÁßÀÎ µ¥ÀÌÅÍ´Â Ãë¼ÒµÈ´Ù. ÀÌ¹Ì º¸³½ µ¥ÀÌÅÍÀÇ ÀÀ´äÀ» ±â´Ù¸®´Â °Íµµ Áß´ÜÇÑ´Ù. ¸¸¾à ±×°ÍÀ» ÀÒ¾î¹ö¸±Áö¶óµµ ÀçÀü¼ÛÇÏÁö ¾Ê´Â´Ù.
2 ¼ö½Å°ú ¼Û½Å ¸ðµÎ¸¦ Áß´ÜÇÑ´Ù.
¼º°øÇÏ¸é ¹Ýȯ°ªÀÌ 0À̰í, ½ÇÆÐ¸é -1ÀÌ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Â errno ¿¡·¯ »óȲÀÌ´Ù:
EBADF socketÀÌ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK socketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
ENOTCONN socketÀÌ ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù
11.7.3 ¼ÒÄÏ ½Ö
¼ÒÄϽÖÀº ¿¬°áµÈ (±×·¯³ª À̸§¾ø´Â) ¼ÒÄÏÀÇ ½ÖÀ¸·Î ±¸¼ºµÈ´Ù. ±×°ÍÀº pipe¿Í À¯»çÇÏ°í ¹«Ã´ °°Àº ¹æ ¹ýÀ¸·Î »ç¿ëµÈ´Ù. ¼ÒÄϽÖÀº 'sys/socket.h'¿¡ ¼±¾ðµÈ socketpairÇÔ¼ö·Î ¸¸µé¾îÁø´Ù. ¼ÒÄϽÖÀº ÆÄÀÌÇÁ ¿Í ´ë´ÜÈ÷ À¯»çÇÏ´Ù:
ÁÖµÈ Â÷ÀÌÁ¡Àº ¼ÒÄϽÖÀº ¾ç¹æÇâÀ̶ó´Â °ÍÀÌ´Ù. ÆÄÀÌÇÁ´Â ÇϳªÀÇ ÀԷ¸¸ µÇ´Â Âʰú Ãâ·Â¸¸ µÇ´Â ÇÑ Âʸ¸À» °¡Áö°í ÀÖ´Ù. (10Àå[Pipe¿Í FIFO]¸¦ º¸¶ó 145ÂÊ)
int socketpair (int namespace, int style, int protocol, int filedes[2]) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼ÒÄϽÖÀ» ¸¸µé¸ç, filedes[0]°ú filedes[1]¾È¿¡ ÆÄÀϼ¼úÀÚ¸¦ ¹ÝȯÇÑ´Ù. ¼ÒÄϽÖÀº ÀüÀÌÁß (full-duplex)¼º Åë½Å ä³ÎÀ̱⠶§¹®¿¡ ÇÑÂÊ¿¡¼ Àаųª ¾²±â°¡ °¡´ÉÇÏ´Ù. namespace,style,protocolÀÎ ÀÚ´Â socketÇÔ¼ö¿¡¼ ó·³ ÇØ¼®µÈ´Ù. styleÀº 11.2Àý[Åë½Å½ºÅ¸ÀÏ]¿¡ ³ª¿µÈ °ÍÀÌ´Ù. namespaceÀÎÀÚ ´Â À̸§°ø°£À» ¸í½ÃÇϸç, ¹Ýµå½Ã AF_FILEÀ̾î¾ß ÇÑ´Ù. (11.4Àý[ÆÄÀÏÀ̸§°ø°£],153ÂÊÀ» ÂüÁ¶Ç϶ó); protocolÀº Åë½Å ÇÁ·ÎÅäÄÝÀ» ¼¼úÇϰí 0µµ ÀǹÌÀÖ´Â °ªÀÌ´Ù. ¸¸¾à style ÀÌ ºñ¿¬°áÅë½Å½ºÅ¸Àϸ¦ ¸í ½ÃÇϸé, ´ç½ÅÀÌ ¾ò°Ô µÇ´Â µÎ ¼ÒÄÏÀº¿¬°áµÇÁö ¾Ê´Â´Ù. ¾ö¹ÐÈ÷ ¸»ÇØ, ±×µé °¢°¢Àº ¼·ÎÀÇ ¸ñÀûÁö ÁÖ¼Ò ¸¦ ¾Ë°í ÀÖ¾î, ¼·Î¿¡°Ô ÆÐŶÀ» º¸³¾¼ö ÀÖ°Ô µÈ´Ù.
socketpairÇÔ¼ö´Â ¼º°ø½Ã¿¡ 0À», ½ÇÆÐ½Ã¿¡ -1À» ¹ÝȯÇÑ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀǵǾî ÀÖ´Â errno¿¡ ·¯ »óȲÀÌ´Ù:
EMFILE ÇÁ·Î¼¼½º°¡ ³Ê¹« ¸¹Àº ÆÄÀÏ ¼¼úÀÚ¸¦ ¿¾î ³õ°í ÀÖ´Ù.
EAFNOSUPPORT ¸í½ÃµÈ À̸§°ø°£ÀÌ Áö¿øµÇÁö ¾Ê´Â °ÍÀÌ´Ù.
EPROTONOSUPPORT ¸í½ÃµÈ ÇÁ·ÎÅäÄÝÀÌ Áö¿øµÇÁö ¾Ê´Â °ÍÀÌ´Ù.
EOPNOTSUPP ¸í½ÃµÈ ÇÁ·ÎÅäÄÝÀÌ ¼ÒÄϽÖÀ» ¸¸µå´Â °ÍÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
11.8 ¿¬°áÇϴµ¥ ¼ÒÄÏ»ç¿ë
´ëºÎºÐÀÇ Åë½Å ½ºÅ¸ÀÏÀº ƯÁ¤ÇÑ ´Ù¸¥ ¼ÒÄϰú ¿¬°áÀ» ¸¸µé°í ¼ÒÄϰú ¼ÒÄÏÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ±³È¯ ÇÑ´Ù. ¿¬°áÀ» ¸¸µå´Â °ÍÀº ºñ´ëĪÀÌ´Ù.; ÇÑÂÊ(Ŭ¶óÀ̾ðÆ®)´Â ´Ù¸¥ ÂÊ(¼¹ö)ÀÌ ¼ÒÄÏÀ» ¸¸µé°í ¿¬°á¿ä±¸ ¸¦ ±â´Ù¸±¶§±îÁö ¿¬°áÀ» ¿ä±¸Çϵµ·Ï µÇ¾î ÀÖ´Ù.
o 11.8.1Àý [¿¬°áÇϱâ], 166ÂÊÀº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ¼¹ö¿Í ¿¬°áÀ» ÃʱâÈÇϱâ À§ÇØ ¹«¾ùÀ» ÇØ¾ß ÇÏ´ÂÁö¸¦ ¼¼úÇÑ´Ù.
o 11.8.2Àý [µè±â],167Âʰú 11.8.3[¿¬°áÀ» ¼ö¶ôÇϱâ], 167ÂÊ¿¡¼´Â ¼¹ö ÇÁ·Î±×·¥ÀÌ Å¬¶óÀÌ¾ðÆ®·ÎºÎÅÍ ¿¬°á¿ä±¸¸¦ ±â´Ù¸®°í ¹Þ¾ÆµéÀÌ´Â °Í¿¡ ´ëÇÑ ¼¼úÀ» ÇÑ´Ù.
o 11.8.5[µ¥ÀÌÅÍ Àü¼Û], 169ÂÊÀº ¾î¶»°Ô ¿¬°áµÈ ¼ÒÄÏÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â ¹æ¹ýÀ» ¼¼úÇÑ´Ù.
11.8.1 ¿¬°á ¸¸µé±â
¿¬°áÀ» ¸¸µé ¶§, Ŭ¶óÀÌ¾ðÆ®´Â ¼¹ö°¡ ¿¬°áÀ» ±â´Ù¸®°í ¼ö¶ôÇÏ´Â µ¿¾È ¿¬°áÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ¿©±â ¿¡ Ŭ¶óÀÌ¾ðÆ®°¡ 'sys/socket.h'¿¡ ¼±¾ðµÈ connectÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¹«¾ùÀ» ÇØ¾ß ÇÒ °ÍÀÎÁö¸¦ ³íÀÇÇÏ °í ÀÖ´Ù.
int connect (int socket, struct sockaddr *addr, size_t length) ÇÔ¼ö
connectÇÔ¼ö´Â addr¿Í lengthÀÇ ±æÀÌ·Î ¸í½ÃµÈ ÁÖ¼Ò¸¦ °¡Áö´Â ¼ÒÄÏÀÇ socketÀ̶ó´Â ÆÄÀϼ¼úÀÚ¸¦ ÀÌ ¿ëÇÏ¿© ¼ÒÄÏÀ¸·ÎºÎÅÍ ¿¬°áÀ» ÃʱâÈ ÇÑ´Ù. (ÀÌ ¼ÒÄÏÀº ÀüÇüÀûÀ¸·Î ´Ù¸¥ ÀåÄ¡ÀÇ °ÍÀÌ´Ù. ±×°ÍÀº ¼¹ö ó·³ ÀÌ¹Ì ¼³Á¤µÇ¾î¾ß ÇÑ´Ù.) ÀÌ ÀμöµéÀÌ ¾î¶»°Ô ÇØ¼®µÇ´ÂÁö¿¡ °üÇÑ Á¤º¸´Â 11.3Àý[¼ÒÄÏÁÖ¼Ò],150 ÂÊÀ» º¸¶ó
º¸Åë, connect´Â ¼¹ö°¡ ¿ä±¸¿¡ ÀÀ´äÇÒ¶§±îÁö ±â´Ù¸°ÈÄ ¹ÝȯÇÏ°Ô µÈ´Ù. ÀÀ´äÀ» ±â´Ù¸®Áö ¾Ê°í Áï½Ã ¹ÝȯÇϵµ·Ï ¼ÒÄÏ socketÀ» ºí·ÏÅ·µÇÁö ¾Êµµ·Ï(non-blocking) ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå ¿¡ °üÇÑ Á¤º¸´Â 8.10Àý [ÆÄÀÏ »óÅ Ç÷¢], 116ÂÊÀ» º¸¶ó.
connect·ÎºÎÅÍÀÇ ¹Ýȯġ´Â º¸Åë 0ÀÌ´Ù. ¸¸¾à ¿¡·¯°¡ ¹ß»ý½Ã¿¡´Â -1À» ¹ÝȯÇÑ´Ù. ÀÌ ÇÔ¼ö¿¡ ¼±¾ðµÇ¾î ÀÖ´Â errno¿¡·¯ »óȲÀº ´ÙÀ½°ú °°´Ù.
EBADF ¼ÒÄÏsocketÀÌ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK ¼ÒÄÏsocketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EADDRNOTAVAIL ¸í½ÃµÈ ÁÖ¼Ò°¡ ¿ø°ÝÀåÄ¡(»ó´ë¹æ±â±â)¿¡ »ç¿ëÇÒ¼ö ¾ø´Â °ÍÀÌ´Ù.
EAFNOSUPPORT addrÀÇ À̸§°ø°£ÀÌ ÀÌ ¼ÒÄÏ¿¡¼ Áö¿øÇÏÁö ¾Ê´Â °ÍÀÌ´Ù.
EISCONN ¼ÒÄÏsocketÀÌ ÀÌ¹Ì ¿¬°áµÇ¾î ÀÖ´Ù.
ETIMEDOUT ¿¬°á¼³Á¤À» ½ÃµµÇÏ´Ù°¡ ½Ã°£À» ÃʰúÇÏ¿´´Ù.
ECONNREFUSED ¼¹ö°¡ ¿¬°á¼³Á¤À» Á÷Á¢ °ÅÀýÇÏ¿´´Ù.
ENETUNREACH ÁÖ¾îÁø addrÀÇ ³×Æ®¿öÅ©´Â ÀÌ È£½ºÆ®·ÎºÎÅÍ µµ´ÞÇÒ¼ö ¾ø´Ù.
EADDRINUSE ÁÖ¾îÁø addrÀÇ ¼ÒÄÏÁÖ¼Ò°¡ ÀÌ¹Ì »ç¿ë ÁßÀÌ´Ù.
EINPROGRESS ¼ÒÄÏsocketÀÌ ºí·ÏÅ·µÇÁö ¾Ê´Â °ÍÀ̰í, ¿¬°áÀ» Áï½Ã ¼³Á¤ÇÒ¼ö ¾ø¾ú´Ù.
EALREADY ¼ÒÄÏsocketÀÌ ºí·ÏÅ·µÇÁö ¾Ê´Â °ÍÀ̰í, ÀÌ¹Ì ÁøÇàÁßÀÎ ¹Ì°áÁ¤ÀÇ ¿¬°áÀÌÀÖ´Ù.
11.8.2 ¿¬°á µè±â
ÀÌÁ¦ ¼¹öÇÁ·Î¼¼½º°¡ ¼ÒÄÏ¿¡¼ ¿¬°áÀ» ¼ö¶ôÇϱâ À§ÇØ ¹«¾ùÀ» ÇØ¾ß ÇÏ´ÂÁö °í·ÁÇØº¸ÀÚ. À̰ÍÀº listenÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¼ÒÄÏ¿¡¼ ¿¬°á¿ä±¸¸¦ °¡´ÉÇÏ°Ô ÇÏ°í ³ª¼, acceptÇÔ¼ö (11.8.3Àý [¿¬°á¼ö¶ô], 167ÂÊÀ» º¸¶ó)À» »ç¿ëÇÏ¿© ¿ä±¸¸¦ ¹Þ¾ÆµéÀÌ´Â °ÍÀ» Æ÷ÇÔÇÑ´Ù. listenÇÔ¼ö´Â ºñ¿¬°á Åë½Å ½ºÅ¸ÀÏÀ» Áö ¿øÇÏÁö ¾Ê´Â´Ù. ¿¬°á ¿ä±¸°¡ ÀÖÀ» ¶§±îÁö ¼öÇàÀ» ½ÃÀÛÇÏÁö ¾Êµµ·Ï ³×Æ®¿öÅ© ¼¹ö¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. 11.10.1Àý[Inetd ¼¹öµé], 179ÂÊÀ» º¸¶ó.
ÀÎÅÍ³Ý À̸§°ø°£¿¡¼, ÇÑ Æ÷Æ®·ÎÀÇ ¿¬°á¿¡ Á¢±ÙÀ» Á¦¾îÇÏ´Â º¸È£ ¸ÞÄ«´ÏÁòÀÌ ¾ø´Ù. ¾î¶² ÀåÄ¡¿¡¼ ¾î¶² ÇÁ·Î¼¼½º°¡ ´ç½ÅÀÇ ¼¹ö¿¡ ¿¬°áÀ» ¸¸µé ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ´ç½ÅÀÇ ¼¹ö¿¡ Á¢±ÙÀ» Á¦¾îÇϱ⠸¦ ¿øÇÑ´Ù¸é, ¿¬°á¿ä±¸¿¡ ¿¬°èµÈ ÁÖ¼Ò¸¦ °Ë»çÇϰųª, ´Ù¸¥ Çù»ó°úÁ¤À̳ª ½Äº°±â´ÉÀÌ ÀÖ´Â ÇÁ·ÎÅäÄÝÀ» ±¸ÇöÇÏ¸é µÈ´Ù.
ÆÄÀÏ À̸§°ø°£¿¡¼, º¸Åë ÆÄÀÏ º¸È£ ºñÆ®´Â ¼ÒÄÏ ¿¬°á¿¡ Á¢±ÙÇÏ´Â »ç¶÷À» Á¦¾îÇÒ ¼ö ÀÖ´Ù.
int listen (int socket, unsigned int n) ÇÔ¼ö
listenÇÔ¼ö´Â ¼ÒÄÏsocketÀ» ¿¬°áÀ» ¼ö¶ôÀÌ °¡´ÉÇϵµ·Ï ÇÏ¿©, ±×°ÍÀ» ¼¹ö¼ÒÄÏÀ¸·Î ¸¸µç´Ù.
Àμö nÀº ¹Ì°áµÈ ¿¬°áÀÇ Å¥ÀÇ ±æÀ̸¦ ¸í½ÃÇÑ´Ù.
listenÇÔ¼ö´Â ¼º°ø½Ã¿¡ 0À» ½ÇÆÐ½Ã -1À» ¹ÝȯÇϸç, ÀÌ ÇÔ¼ö¿¡ Á¤ÀÇµÈ errno¿¡·¯ »óȲÀº ´ÙÀ½°ú °°´Ù.
EBADF Àμösocket´Â À¯È¿ÇÑ ÆÄÀϼ¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK ÀμösocketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EOPNOTSUPP ¼ÒÄÏsocket´Â ÀÌ ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
11.8.3 ¿¬°á ¼ö¶ô
¼¹ö°¡ ¿¬°á¿ä±¸¸¦ ¼ö½ÅÇÏ¿´À» ¶§, ¿¬°á¿ä±¸¸¦ ¼ö¶ôÇÔÀ¸·Î½á ¿¬°áÀÌ ³¡³¯ ¼ö ÀÖ´Ù. acceptÇÔ¼ö¸¦ »ç ¿ëÇÏ¿© ±×°ÍÀ» ¼öÇàÇÑ´Ù. ¼¹ö·Î ¼³Á¤µÈ ¼ÒÄÏÀº ¿©·¯ Ŭ¶óÀÌ¾ðÆ®·ÎºÎÅÍÀÇ ¿¬°á¿ä±¸¸¦ ¼ö¶ôÇÒ ¼ö ÀÖ ´Ù. ¼¹öÀÇ ¿ø ¼ÒÄÏ(original socket)Àº ¿¬°áÀÇ ºÎºÐÀÌ µÇÁö ¾Ê´Â´Ù. ´ë½Å¿¡, accept´Â ¿¬°á¿¡ ƯÁ¤ÇÑ »õ·Î¿î ¼ÒÄÏÀ» ¸¸µç´Ù. accpect´Â ÀÌ ¼ÒÄÏ¿¡ ´ëÇÑ ¼¼úÀÚ¸¦ ¹ÝȯÇÑ´Ù.
¼¹öÀÇ ¿ø ¼ÒÄÏÀº ´ÙÀ½ ¿¬°á¿ä±¸¸¦ µè±â À§ÇÏ¿© °è¼Ó ³²¾ÆÀÖ´Ù.
¼¹ö¼ÒÄÏÀÇ ºñ°áµÈ ¿¬°á¿ä±¸ÀÇ ¼ö´Â Á¦ÇѵǾî ÀÖ´Ù. ¸¸¾à Ŭ¶óÀÌ¾ðÆ®µé·Î ºÎÅÍÀÇ ¿¬°á ¿ä±¸°¡ ¼¹ö °¡ ±×°ÍÀ» ó¸®ÇÒ ¼ö ÀÖ´Â °Å º¸´Ù ´õ ºü¸£´Ù¸é, Å¥°¡ °¡µæÃ¤¿ö Áú °ÍÀ̰í, Ãß°¡ÀûÀÎ ¿ä±¸´Â ECONNREFUSED¿¡·¯·Î °ÅÀý µÈ´Ù. ºñ·Ï ½Ã½ºÅÛ ³»ºÎÀÇ Å¥°¡ Á¦ÇѵǾî ÀÖÀ» Áö¶óµµ listenÇÔ¼öÀÇ Àμö·Î ÀÌ Å¥ÀÇ ÃÖ´ë ±æÀ̸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.
int accept (int socket, struct sockaddr *addr, size_t *length_ptr)
ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ¼¹ö¼ÒÄÏ socketÀÇ ¿¬°á¿ä±¸¸¦ ¼ö¶ôÇϴµ¥ »ç¿ëµÈ´Ù. ¸¸¾à ¹Ì°áµÈ ¿¬°áÀÌ ¾ø°í ¼ÒÄÏ socketÀÌ ºí·ÏÅ·µÇµµ·Ï ¼¼Æ®µÇ¾îÀÖÀ¸¸é acceptÇÔ¼ö´Â °è¼Ó ±â´Ù¸°´Ù. (ºí·ÏÅ· ¾ÈµÇ´Â ¼ÒÄÏÀ¸·Î ±â´Ù ¸®°ÔÇϵµ·Ï ¼±ÅÃÇÒ ¼öµµ ÀÖ´Ù.) ºí·ÏÅ· ¾ÈµÇ´Â ¸ðµå¿¡ °üÇÑ Á¤º¸´Â 8.10Àý [ÆÄÀÏ »óÅ Ç÷¢], 116ÂÊÀ» º¸¶ó. addr°ú length_ptrÀμö´Â ÃʱâÈµÈ ¿¬°áÀÇ Å¬¶óÀÌ¾ðÆ® ¼ÒÄÏÀÇ À̸§¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇϴµ¥ »ç¿ëµÈ´Ù. 11.3Àý [¼ÒÄÏÁÖ¼Ò], 150ÂÊ¿¡ Á¤º¸Æ÷¸Ë¿¡ °üÇÑ Á¤º¸°¡ ÀÖ´Ù. {{}}
¿¬°áÀ» ¼ö¶ôÇÏ´Â °ÍÀº socketºÎºÐÀ» ¿¬°áÀÇ ÀϺηΠ¸¸µéÁö ¾Ê´Â´Ù. ´ë½Å¿¡, ¿¬°áµÉ »õ·Î¿î ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù. acceptÀÇ Á¤»óÀûÀÎ ¹Ýȯġ´Â »õ·Î¿î ¼ÒÄÏÀÇ ÆÄÀϼ¼úÀÚÀÌ´Ù. acceptÈÄ¿¡, ¿ø·¡ÀÇ ¼ÒÄÏÀÎ socketÀº ¿·Á ÀÖ°í, ¿¬°áµÇÁö ¾ÊÀº »óÅ·Π³²¾ÆÀÖ°Ô µÈ´Ù. ±×¸®°í ±×°ÍÀÌ ´ÝÈú ¶§±îÁö µè±â¸¦ °è¼Ó ÇÒ °ÍÀÌ´Ù. accept¸¦ È£ÃâÇÏ¿© ÀÌ ¼ÒÄÏÀ» ÅëÇÏ¿© Ãß°¡ÀûÀÎ ¿¬°áÀ» ¼ö¶ôÇÒ ¼ö ÀÖ´Ù.
¸¸¾à ¿¡·¯°¡ ¹ß»ýÇϸé accept´Â -1À» ¹ÝȯÇÑ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀǵǾî ÀÖ´Â errno¿¡·¯Á¶°ÇÀÌ´Ù:
EBADF socketÀμö°¡ À¯È¿ÇÑ ÆÄÀϼ¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK ¼¼úÀÚ socketÀμö°¡ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EOPNOTSUPP ¼¼úÀÚ socketÀÌ ÀÌ ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
EWOULDBLOCK socketÀÌ ºí·ÏÅ·¾ÈµÇ´Â ¸ðµå·Î ¼¼Æ®µÇ¾î ÀÖ°í, Áï½Ã ¿¬°áµÉ ¼ö ÀÖ´Â ¹Ì°áÀÇ ¿¬°áÀÌ ¾ø´Ù.
acceptÇÔ¼ö´Â ºñ¿¬°á¼º Åë½Å ½ºÅ¸ÀÏÀÇ ¼ÒÄÏ¿¡´Â »ç¿ëµÉ ¼ö ¾ø´Ù.
11.8.4 ´©°¡ ³ª¿¡°Ô ¿¬°áµÇ¾î ÀÖ³ª?
int getpeername (int socket, struct sockaddr *addr, size_t *length_ptr) ÇÔ¼ö
getpeernameÇÔ¼ö´Â socketÀÌ ¿¬°áµÇ¾î ÀÖ´Â ¼ÒÄÏÀÇ ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù; addr°ú lengh_ptr¿¡ ÀÇÇØ ¸í½Ã µÈ ¸Þ¸ð¸® °ø°£¿¡ ±× ÁÖ¼Ò°¡ ÀúÀåµÈ´Ù. *length_ptr¾È¿¡ ÁÖ¼ÒÀÇ ±æÀ̸¦ ÀúÀåÇÑ´Ù.
ÁÖ¼ÒÀÇ Æ÷¸Ë¿¡ °üÇÏ¿©´Â 11.3Àý [¼ÒÄÏ ÁÖ¼Ò], 150ÂÊÀ» º¸¶ó. ¾î¶² ¿î¿µÃ¼Á¦¿¡¼, getpeernameÀº ´ÜÁö ÀÎÅÍ³Ý µµ¸ÞÀÎÀÇ ¼ÒÄÏ¿¡¼¸¸ µ¿ÀÛÇÑ´Ù.
¼º°ø½Ã¿¡ 0À» ½ÇÆÐ½Ã¿¡ -1À» ¹ÝȯÇÑ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀǵÈ
errno¿¡·¯Á¶°ÇÀÌ´Ù:
EBADF socketÀμö°¡ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK socket¼¼úÀÚ°¡ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
ENOTCONN socket¼ÒÄÏÀÌ ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù.
ENOBUFS ÃæºÐÇÑ ³»ºÎ ¹öÆÛ°¡ ¾ø´Ù.
11.8.5 µ¥ÀÌÅÍ Àü¼Û
ÀÏ´Ü ¼ÒÄÏÀÌ »ó´ëÃø°ú ¿¬°áÀÌ µÇ¸é, µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â ÀϹÝÀûÀÎ write¿Í read µ¿ÀÛÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. (8.2Àý [I/O Ãß»ó], 105ÂÊÀ» º¸¶ó) ¼ÒÄÏÀº ¾ç¹æÇâ ä³ÎÀ̹ǷΠÇÑÂÊ¿¡¼ ÀÐ°í ¾²±â°¡ °¡´ÉÇÏ´Ù.
¼ÒÄÏÀÇ µ¿ÀÛÀ» ¸í½ÃÇÏ´Â ¸î°¡Áö I/O¸ðµå°¡ ÀÖ´Ù. ±×·¯ÇÑ ¸ðµå¸¦ ¸í½ÃÇÏ·Á¸é, ´õ ÀϹÝÀûÀÎ read¿Í write´ë½Å¿¡ recv¿Í send ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. recv¿Í sendÇÔ¼ö´Â Ưº°ÇÑ I/O¸ðµå¸¦ Á¦¾îÇϱâ À§ ÇÑ ¿©·¯°¡Áö Ç÷¢À» ¸í½ÃÇϴµ¥ »ç¿ëµÇ´Â Ãß°¡ÀûÀÎ Àμö¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ¿¹¸¦µé¾î out-of-band µ¥ÀÌ Å͸¦ Àаųª ¾²±â À§ÇÏ¿© MSG_OOBÇ÷¢À» ¸í½ÃÇÒ ¼ö ÀÖ°í, ÀÔ·ÂÀ» ¿³º¸±â À§ÇÏ¿© MSG_PEEK¸¦ ¼¼Æ®Çϰųª, Ãâ·Â½Ã ¶ó¿ìÆÃÁ¤º¸ÀÇ Æ÷ÇÔÀ» Á¦¾îÇϱâ À§ÇÏ¿© MSG_DONTROUTEÇ÷¢À» ¸í½ÃÇÒ ¼ö ÀÖ ´Ù.
11.8.5.1 µ¥ÀÌÅÍ º¸³»±â
sendÇÔ¼ö´Â 'sys/socket.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ¸¸¾à flagÀμö¸¦ 0À¸·Î ÇÏ´Â °æ¿ì¸é, send´ë½Å¿¡ write ¸¦ ¾µ ¼ö ÀÖ´Ù.; 8.2Àý [I/O Ãß»ó], 105ÂÊÀ» º¸¶ó. ¸¸¾à ¼ÒÄÏÀÌ ¿¬°áµÇ¾î ÀÖ´Â »óŶó¸é, send³ª write ¸¦ »ç¿ëÇÒ ¶§ SIGPIPE¶ó´Â ½Ã±×³ÎÀ» ¾òÀ» °ÍÀÌ´Ù. (21.2.6Àý [¿©·¯°¡Áö ½Ã±×³Î], 278ÂÊÀ» º¸¶ó)
int send (int socket, void *buffer, size_t size, int flags) ÇÔ¼ö
sendÇÔ¼ö´Â write¿Í ºñ½ÁÇÏÁö¸¸, Ãß°¡ÀûÀÎ flags¶ó´Â Ç÷¢À» °¡Áö°í ÀÖ´Ù. flags¿¡ °¡´ÉÇÑ °ªµéÀº 11.8.5.3Àý[¼ÒÄÏ µ¥ÀÌÅÍ ¿É¼Ç], 170ÂÊ¿¡ ¼¼úµÇ¾î ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â Àü¼ÛµÈ ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ¹ÝȯÇϸç, ½ÇÆÐ½Ã -1À» ¹ÝȯÇÑ´Ù. ¸¸¾à ¼ÒÄÏÀÌ ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå¶ó¸é, send°¡ (writeó·³) µ¥ÀÌÅÍÀÇ ÀϺΠ¸¸ Àü¼ÛÇÑ µÚ ¹ÝȯµÉ °ÍÀÌ´Ù. ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå¿¡ °üÇÏ¿©´Â 8.10Àý [ÆÄÀÏ »óÅ Ç÷¢] 116ÂÊÀ» º¸¶ó. ¾î°°Å³ª, ¼º°ø½ÃÀÇ ¹Ýȯġ´Â ¿¡·¯¾øÀÌ Àü¼ÛµÈ ¸Þ½ÃÁö¸¦ °¡¸®Å³ »Ó, ¿¡·¯¾øÀÌ ¼ö½ÅµÇ´Â °Í ó·³ ÇʼöÀûÀÎ °ÍÀÌ ¾Æ´Ô¿¡ ÁÖÀÇÇ϶ó.
´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ Á¤ÀÇµÈ errno¿¡·¯ Á¶°ÇÀÌ´Ù.
EBADF socketÀμö°¡ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
EINTR µ¥ÀÌÅ͸¦ º¸³»±â Àü¿¡, ½Ã±×³Î¿¡ ÀÇÇØ ÀÎÅÍ·´Æ®°¡ °É·È´Ù. 21.5Àý [ÀÎÅÍ·´Æ® Ãß»ó] 293ÂÊÀ» º¸¶ó.
ENOTSOCK socket¼¼úÀÚ°¡ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EMSGSIZE ¼ÒÄÏÁ¾·ù°¡ ¸Þ½ÃÁö¸¦ ÀÛ°Ô º¸³¾ °ÍÀ» ¿ä±¸Çϴµ¥, ÀÌ ¸Þ½ÃÁö°¡ ³Ê¹« Å©´Ù.
EWOULDBLOCK
ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå°¡ ¼ÒÄÏ¿¡ ¼¼Æ®µÇ¾î ÀÖÀ¸³ª, ¾²±â µ¿ÀÛÀÌ ºí·ÏÅ·µÉ °ÍÀÌ´Ù. (º¸Åë send´Â µ¿ ÀÛÀÌ ³¡³¯ ¼ö ÀÖÀ» ¶§±îÁö ºí·ÏÅ·µÈ´Ù.)
ENOBUFS ÃæºÐÇÑ ³»ºÎ¹öÆÛ°ø°£ÀÌ ¾ø´Ù.
ENOTCONN ´ç½ÅÀº ÀÌ ¼ÒÄÏ¿¡ ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù.
EPIPE ÀÌ ¼ÒÄÏÀº ¿¬°áµÇ¾î ÀÖÁö¸¸, ¿¬°áÀÌ ±úÁ®ÀÖ´Ù. ÀÌ °æ¿ì send´Â SIGPIPE½Ã±×³ÎÀ» ¸Õ Àú »ý¼ºÇÑ´Ù; ¸¸¾à ½Ã±×³ÎÀÌ ¹«½Ã µÇ°Å³ª ºí·ÏÅ·µÇ°Å³ª, Çڵ鷯°¡ ¹ÝȯµÈ´Ù¸é, send´Â EPIPE·Î ½ÇÆÐ¸¦ ¾Ë¸®°Ô µÈ´Ù.
11.8.5.2 µ¥ÀÌÅÍ ¼ö½ÅÇϱâ
recvÇÔ¼ö´Â 'sys/socket.h' Çì´õ ÆÄÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ¸¸¾à flagsÀμö°¡ 0À̸é recv´ë½Å¿¡ read¸¦ ½áµµ µÈ´Ù.; 8.2Àý [I/OÃß»ó], 105ÂÊÀ» ÂüÁ¶Ç϶ó.
int recv (int socket, void *buffer, size_t size, int flags) ÇÔ¼ö
recvÇÔ¼ö´Â read¿Í À¯»çÇÏÁö¸¸, Ãß°¡ÀûÀ¸·Î flags¶ó´Â Ç÷¢À» °¡Áö°í ÀÖ´Ù. flags¿¡ °¡´ÉÇÑ °ªÀº 11.8.5.3Àý [¼ÒÄÏ µ¥ÀÌÅÍ ¿É¼Ç], 170ÂÊ¿¡ ¼¼úµÇ¾î ÀÖ´Ù.
¸¸¾à ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå·Î ¼ÒÄÏ¿¡ ¼¼Æ®µÇ¾î ÀÖ°í, ÀÐÀ» µ¥ÀÌÅͰ¡ ¾øÀ¸¸é, recv´Â ±â´Ù¸®Áö ¾Ê°í Áï½Ã ½ÇÆÐ·Î ³¡³´Ù. ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå¿¡ °üÇÑ Á¤º¸´Â 8.10Àý [ÆÄÀÏ »óÅ Ç÷¢], 116ÂÊÀ» º¸¶ó. ÀÌ ÇÔ¼ö´Â ¼ö½ÅµÈ ¹ÙÀÌÆ®¼ö¸¦ ¹ÝȯÇϰųª,½ÇÆÐ½Ã -1À» ¹ÝȯÇÑ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ ¼±¾ðµÈ errno¿¡ ·¯ Á¶°ÇÀÌ´Ù.
EBADF socketÀμö°¡ À¯È¿ÇÑ ÆÄÀϼ¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK socket¼¼úÀÚ°¡ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
EWOULDBLOCK ¼ÒÄÏ¿¡ ºí·ÏÅ·µÇÁö ¾Ê´Â ¸ðµå°¡ ¼¼Æ®µÇ¾î ÀÖ°í, Àб⠵¿ÀÛÀÌ ºí·ÏµÉ °ÍÀÌ´Ù. (º¸Åë recv´Â Àб⠰¡´ÉÇÑ ÀÔ·ÂÀÌ ÀÖÀ» ¶§±îÁö ºí·°Å·µÈ´Ù.)
EINTR µ¥ÀÌÅ͸¦ Àб⵵ Àü¿¡ ½Ã½º³Î¿¡ ÀÇÇØ ÀÎÅÍ·´Æ®°¡ °É·È´Ù. 21.5Àý[ÀÎÅÍ·´Æ® Ãß»ó], 293ÂÊÀ» º¸¶ó.
ENOTCONN ´ç½ÅÀº ÀÌ ¼ÒÄÏ¿¡ ¿¬°áµÇ¾î ÀÖÁö ¾Ê´Ù.
11.8.5.3 ¼ÒÄÏ µ¥ÀÌÅÍ ¿É¼Ç
send¿Í recv¿¡ »ç¿ëµÇ´Â flagsÀμö´Â ºñÆ® ¸¶½ºÅ©ÀÌ´Ù. ´ç½ÅÀº ÀÌ Àμö¿¡ °ªÀ» ¾ò±â À§ÇØ ¾Æ·¡ ¸ÅÅ© ·Î·Î ºñÆ®º°-OR¿¬»êÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. 'sys/socket.h'Çì´õÆÄÀÏ¿¡ ¸ðµÎ Á¤ÀǵǾî ÀÖ´Ù.
int MSG__OOB ¸ÅÅ©·Î
out-of-bandµ¥ÀÌÅ͸¦ ¼Û½ÅÇϰųª ¼ö½ÅÇÑ´Ù. 11.8.8Àý [Out-of-band µ¥ÀÌÅÍ], 173ÂÊÀ» º¸¶ó.
int MSG__PEEK ¸ÅÅ©·Î
¼ö½ÅµÈ Å¥·ÎºÎÅÍ µ¥ÀÌÅ͸¦ º¸±â¸¸ ÇÏ°í ±×°ÍÀ» Áö¿ìÁö´Â ¸»¾Æ¶ó. À̰ÍÀº send°¡ ¾Æ´Ñ recv°°Àº ÀÔ ·ÂÇÔ¼ö¿¡¼¸¸ Àǹ̰¡ ÀÖ´Ù. send.
int MSG__DONTROUTE ¸ÅÅ©·Î
ÀÌ ¸Þ½ÃÁö¿¡ ¶ó¿ìÆÃÁ¤º¸¸¦ Æ÷ÇÔÇÏÁö ¸¶¶ó. À̰ÍÀº Ãâ·Â ÇÔ¼ö¿¡¼¸¸ Àǹ̸¦ °®´Â´Ù. ±×¸®°í ºÐ¼®ÀÌ ³ª ¶ó¿ìÆÃ ÇÁ·Î±×·¥¿¡¼¸¸ Èï¹Ì·Ó°Ô »ç¿ëµÈ´Ù. ±×°Í¿¡ ´ëÇÏ¿©´Â ¿©±â¼ ´õ ÀÌ»ó ¼³¸íÇÏÁö ¾Ê´Â´Ù.
11.8.6 Byte Stream ¼ÒÄÏ ¿¹Á¦
À̰ÍÀº ÀÎÅÍ³Ý À̸§°ø°£ÀÇ byte streamÀ» À§ÇÑ ¿¬°áÀ» ¸¸µå´Â ÇÁ·Î±×·¥ÀÇ ¿¹Á¦ÀÌ´Ù. ÇÑ ¹ø ¼¹ö¿¡ ¿¬°áÇÏ°í Æ¯º°ÇÑ ÀÏÀ» ÇÏÁö ¾Ê´Â´Ù. ±×°ÍÀº ´ÜÁö ÅØ½ºÆ® ¹®ÀÚ¿À» ¼¹ö¿¡°Ô º¸³»°í Á¾·áÇÑ´Ù.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 5555
#define MESSAGE "Yow!!! Are we having fun yet?!?"
#define SERVERHOST "churchy.gnu.ai.mit.edu"
void
write_to_server (int filedes)
{
int nbytes;
nbytes =write (filedes, MESSAGE, strlen (MESSAGE) + 1);
if (nbytes < 0)
{
perror ("write");
exit (EXIT_FAILURE);
}
}
int
main (void)
{
extern void init_sockaddr (struct sockaddr_in *name,
const char *hostname,
unsigned short int port);
int sock;
struct sockaddr_in servername;
/* ¼ÒÄϸ¸µé±â */
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror ("socket (client)");
exit (EXIT_FAILURE);
}
/* ¼¹ö¿¡ ¿¬°á */
init_sockaddr (&servername, SERVERHOST, PORT);
if (0 > connect (sock,
(struct sockaddr *) &servername,
sizeof (servername)))
{
perror ("connect (client)");
exit (EXIT_FAILURE);
}
/* ¼¹ö¿¡ µ¥ÀÌÅÍ º¸³»±â */
write_to_server (sock);
close (sock);
exit (EXIT_SUCCESS);
}
11.8.7 Byte Stream Connection ¼¹ö ¿¹Á¦
¼¹öÂÊÀº Á»´õ º¹ÀâÇÏ´Ù. ¿©·¯ Ŭ¶óÀÌ¾ðÆ®°¡ µ¿½Ã¿¡ ¼¹ö¿¡ ¿¬°áÇÒ ¼ö ÀÖµµ·Ï Çϱ⸦ ¿øÇϹǷÎ, °£ ´ÜÈ÷ ÇϳªÀÇ read³ª recv¸¦ È£ÃâÇÏ¿© ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®·ÎºÎÅÍ ÀÔ·ÂÀ» ±â´Ù·Á¼´Â ¾È µÈ´Ù. ´ë½Å¿¡, ¸ðµç ¿¸° ¼ÒÄÏÀ¸·ÎºÎÅÍ ÀÔ·ÂÀ» ±â´Ù¸®µµ·Ï(8.6Àý [I/O ±â´Ù¸®±â], 111ÂÊ), select¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¿Ã ¹Ù¸¥ °ÍÀÌ´Ù. À̰ÍÀº ¶ÇÇÑ Ãß°¡ÀûÀÎ ¿¬°á ¿ä±¸¸¦ ´Ù·çµµ·Ï Çã¶ôÇÑ´Ù.
ÀÌ Æ¯º°ÇÑ ¼¹ö´Â Ŭ¶óÀÌ¾ðÆ®·ÎºÎÅÍ ¸Þ½ÃÁö¸¦ ÇÑ ¹ø ¹Þ´Â ´Ù´Â °Í ¿Ü¿¡ Ưº°È÷ Èï¹Ì·Î¿î ÀÏÀ» ÇÏ Áö ¾Ê´Â´Ù. ±×°ÍÀº (Ŭ¶óÀÌ¾ðÆ®°¡ ¿¬°áÀ» Á¾·áÇÏ´Â °á°ú·Î½á) ÆÄÀÏÀÇ ³¡(end-of-file)Á¶°ÇÀ» °ËÃâÇÏ¿´ À» ¶§,±× Ŭ¶óÀÌ¾ðÆ®¿¡ ´ëÇÑ ¼ÒÄÏÀ» ´Ý´Â´Ù.
ÀÌ ÇÁ·Î±Û·¥Àº ¼ÒÄÏÁÖ¼Ò¸¦ ¼¼Æ®Çϱâ À§ÇØ make_socket°ú init_sockaddr¸¦ »ç¿ëÇÏ¿´´Ù. ; 11.5.7 [Inet ¿¹Á¦],163ÂÊÀ» º¸¶ó
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 5555
#define MAXMSG 512
int
read_from_client (int filedes)
{
char buffer[MAXMSG];
int nbytes;
nbytes = read (filedes, buffer, MAXMSG);
if (nbytes < 0)
{
/* Àб⠿¡·¯ */
perror ("read");
exit (EXIT_FAILURE);
}
else if (nbytes == 0)
/* ÆÄÀÏÀÇ ³¡ */
return -1;
else
{
/* µ¥ÀÌÅÍ Àбâ */
fprintf (stderr, "Server: got message: `%s'\n", buffer);
return 0;
}
}
int
main (void)
{
extern int make_socket (unsigned short int port);
int sock;
int status;
fd_set active_fd_set, read_fd_set;
int i;
struct sockaddr_in clientname;
size_t size;
/* Create the socket and set it up to accept connections. */
sock = make_socket (PORT);
if (listen (sock, 1) < 0)
{
perror ("listen");
exit (EXIT_FAILURE);
}
/* Initialize the set of active sockets. */
FD_ZERO (&active_fd_set);
FD_SET (sock, &active_fd_set);
while (1)
{
/* Block until input arrives on one or more active sockets. */
read_fd_set = active_fd_set;
if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
{
perror ("select");
exit (EXIT_FAILURE);
}
/* Service all the sockets with input pending. */
for (i = 0; i < FD_SETSIZE; ++i)
if (FD_ISSET (i, &read_fd_set))
{
if (i == sock)
{
/* Connection request on original socket. */
size = sizeof (clientname);
if (accept (sock,
(struct sockaddr *) &clientname, &size) < 0)
{
perror ("accept");
exit (EXIT_FAILURE);
}
fprintf (stderr,
"Server: connect from host %s, port %hd.\n",
inet_ntoa (clientname.sin_addr),
ntohs (clientname.sin_port));
FD_SET (status, &active_fd_set);
}
else
{
/* Data arriving on an already-connected socket. */
if (read_from_client (i) < 0)
{
close (i);
FD_CLR (i, &active_fd_set);
}
}
}
}
}
11.8.8 Out-of-Band µ¥ÀÌŸ
¿¬°áÀ» °¡Áø ½ºÆ®¸²Àº ÀÏ¹Ý µ¥ÀÌÅͺ¸´Ù ³ôÀº ¿ì¼±¼øÀ§·Î ¹è´ÞµÇ´Â µ¥ÀÌÅÍÀÎ out-of-Bandµ¥ÀÌÅ͸¦ °¡´ÉÇÏ°Ô ÇÑ´Ù. ÀüÇüÀûÀ¸·Î out-of-bandµ¥ÀÌÅ͸¦ Àü¼ÛÇÏ´Â ÀÌÀ¯´Â ¿¹¿ÜÀûÀÎ »óȲÀÇ Å뺸 ¶§¹®ÀÌ´Ù. out-of-bandµ¥ÀÌÅ͸¦ º¸³»´Â ¹æ¹ýÀº MSG_OOBÇ÷¢À» ¼¼Æ®ÇÑ (11.8.5.1Àý[µ¥ÀÌÅÍ Àü¼Û],169ÂÊ Âü°í) send¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
¼ö½Å ÇÁ·Î¼¼½º°¡ ¼ø¼´ë·Î ±×°ÍÀ» ¹ÞÁö ¾ÊÀ¸¹Ç·Î, out-of-band µ¥ÀÌÅÍ´Â ´õ ³ôÀº ¿ì¼± ¼øÀ§·Î ¹Þ¾Æ Áø´Ù. Áï, ´ÙÀ½ °¡´ÉÇÑ out-of-band µ¥ÀÌÅ͸¦ ÀÐÀ¸·Á¸é, MSG_OOBÇ÷¢À» ¼¼Æ®ÇÏ¿© recv¸¦ »ç¿ëÇÑ ´Ù. (11.8.5.2Àý [µ¥ÀÌÅÍ ¼ö½Å], 169ÂÊÀ» º¸¶ó). º¸Åë Àбâ¸í·ÉÀº out-of-bandµ¥ÀÌÅ͸¦ ÀÐÁö ¾Ê´Â´Ù. ±×°ÍµéÀº ´ÜÁö ÀÏ¹Ý µ¥ÀÌÅ͸¸ Àд´Ù.
¼ÒÄÏÀÌ out-of-bandµ¥ÀÌÅͰ¡ ÀÖÀ½À» ¾Ë°Ô µÇ¸é, ¼ÒÀ¯ÇÁ·Î¼¼½º³ª ¼ÒÄÏÀÇ ÇÁ·Î¼¼½º ±×·ì¿¡ SIGURG½Ã ±×³ÎÀ» º¸³½´Ù. F_SETOWN¸í·ÉÀ¸·Î fcntlÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¼ÒÀ¯ÀÚ¸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.; 8.12Àý [ÀÎÅÍ ·´Æ® ÀÔ·Â], 120ÂÊÀ» º¸¶ó. ¶ÇÇÑ ÀÌ ½Ã±×³ÎÀÇ Çڵ鷯¸¦ ¼³Á¤ÇÒ ¼ö Àִµ¥, out-of-bandµ¥ÀÌÅ͸¦ Àд µîÀÇ ÀûÀýÇÑ µ¿ÀÛÀ» ÃëÇϱâ À§ÇØ, 21Àå[½Ã±×³Î Çڵ鸵], 271ÂÊÀ» º¸¶ó.
´Ù¸¥ °ÍÀ¸·Î, selectÇÔ¼ö¸¦ »ç¿ëÇÏ¿©, ¹Ì°áÀÇ out-of-data¸¦ °Ë»çÇϰųª out-of-bandµ¥ÀÌÅͰ¡ ÀÖÀ» ¶§±îÁö ±â´Ù¸±¼ö ÀÖ´Ù.; ±×°ÍÀº ¼ÒÄÏ ¿¹¿Ü Á¶°ÇÀ» ±â´Ù¸± ¼ö ÀÖ´Ù. select¿¡ °üÇÑ ¸¹Àº Á¤º¸´Â 8.6Àý [I/O¸¦ ±â´Ù¸®±â], 111ÂÊÀ» º¸¶ó.
(SIGURG¸¦ »ç¿ëÇϰųª select¸¦ »ç¿ëÇÒ °ÍÀÌ´øÁö) out-of-band µ¥ÀÌÅÍÀÇ Åë°í´Â out-of-bandµ¥ÀÌ ÅͰ¡ ÁøÇàÁß¿¡ ÀÖÀ½À» °¡¸®Å²´Ù.; Áï µ¥ÀÌÅÍ´Â ¾ÆÁ÷ ½ÇÁ¦·Î µµÂøÇÏÁö ¾Ê¾Ò´Ù. ¸¸¾à ±×°ÍÀÌ ¿ÏÀüÈ÷ µµ ÂøÇϱâ Àü¿¡ out-of-data¸¦ ÀÐÀ¸·Á°í Çϸé, recv ´Â EWOULDBLOCK¿¡·¯·Î ½ÇÆÐÇÏ°Ô µÈ´Ù.
out-of-bandµ¥ÀÌÅÍ Àü¼ÛÀº ÀÚµ¿À¸·Î ÀÏ¹Ý µ¥ÀÌÅÍÀÇ È帧 ¾È¿¡ "¸¶Å©"¸¦ µÐ´Ù. ±×°ÍÀº ¾îµð¿¡ out-of-bandµ¥ÀÌÅͰ¡ ¾îµð¿¡ ÀÖÀ»Áö¸¦ º¸¿©ÁØ´Ù. out-of-band µ¥ÀÌÅͰ¡ ¸ÕÀú º¸³»Áø ¸ðµç °ÍµéÀ» Ãë ¼Ò½ÃŲ´Ù´Â Àǹ̸¦ °¡Áú ¶§ À¯¿ëÇÏ´Ù. ¿©±â¿¡ ¼ö½Å ÇÁ·Î¼¼½º¿¡¼ ¸¶Å©Àü¿¡ º¸³»Áø º¸Åë µ¥ÀÌÅÍÀÎÁö ¾Æ´ÑÁö ¾î¶»°Ô Å×½ºÆ®ÇÏ´ÂÁö°¡ ³ª¿ÍÀÖ´Ù.
success = ioctl (socket, SIOCATMARK, &result);
ÀÌ ÇÔ¼ö´Â out-of-band ¸¶Å© ¾ÕÀÇ ÀÏ¹Ý µ¥ÀÌÅ͸¦ ¹«½ÃÇÏ´Â °ÍÀÌ´Ù.
int
discard_until_mark (int socket)
{
while (1)
{
/* This is not an arbitrary limit; any size will do. */
char buffer[1024];
int result, success;
/* If we have reached the mark, return. */
success = ioctl (socket, SIOCATMARK, &result);
if (success < 0)
perror ("ioctl");
if (result)
return;
/* Otherwise, read a bunch of ordinary data and discard it This is guaranteed not to read past the mark if it starts before the mark. */
success = read (socket, buffer, sizeof buffer);
if (success < 0)
perror ("read");
}
}
¸¸¾à ¸¶Å©¾ÕÀÇ ÀÏ¹Ý µ¥ÀÌÅ͸¦ ¹«½ÃÇÏÁö ¾ÊÀ¸·Á¸é, ±×°ÍÀ» ¾î¶»°Ôµç Àбâ À§ÇØ, out-of-bandµ¥ÀÌÅÍ ¸¦ À§ÇÑ ³»ºÎ½Ã½ºÅÛ¹öÆÛ °ø°£À» ¸¸µé¾î¾ß ÇÑ´Ù. ¸¸¾à out-of-bandµ¥ÀÌÅ͸¦ ÀÐÀ¸·Á Çϴµ¥ EWOULDBLOCK¿¡·¯¸¦ ¹Þ´Â´Ù¸é, ¾à°£ÀÇ ÀϹݵ¥ÀÌÅ͸¦ (±×°ÍÀ» ¾ò¾úÀ» ¶§ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÀúÀå À» Çϸç) Àб⸦ ½ÃµµÇ϶ó. ±×¸®°í ±×°ÍÀÌ °ø°£À» ¸¸µå´ÂÁö¸¦ º¸¾Æ¶ó. ¿©±â ¿¹Á¦°¡ ÀÖ´Ù.
struct buffer
{
char *buffer;
int size;
struct buffer *next;
};
/* Read the out-of-band data from SOCKET and return it as a `struct buffer', which records the address of the data and its size.
It may be necessary to read some ordinary data in order to make room for the out-of-band data. If so, the ordinary data is saved as a chain of buffers found in the `next' field of the value. */
struct buffer *
read_oob (int socket)
{
struct buffer *tail = 0;
struct buffer *list = 0;
while (1)
{
/* This is an arbitrary limit. Does anyone know how to do this without a limit? */
char *buffer = (char *) xmalloc (1024);
struct buffer *link;
intsuccess;
int result;
/* Try again to read the out-of-band data. */
success = recv (socket,buffer,sizeof buffer,MSG_OOB);
if (success >= 0)
{
/* We got it, so return it. */
struct buffer *link
=(struct buffer*) xmalloc(sizeof(struct buffer));
link->buffer = buffer;
link->size = success;
link->next = list;
return link;
}
/* If we fail, see if we are at the mark. */
success = ioctl (socket, SIOCATMARK, &result);
if (success < 0)
perror ("ioctl");
if (result)
{
/* At the mark; skipping past more ordinary data cannot help. So just wait a while. */
sleep (1);
continue;
}
/* Otherwise, read a bunch of ordinary data and save it. This is guaranteed not to read past the mark if it starts before the mark. */
success = read (socket, buffer, sizeof buffer);
if (success < 0)
perror ("read");
/* Save this data in the buffer list. */
{
struct buffer *link
= (struct buffer *) xmalloc(sizeof (struct buffer));
link->buffer = buffer;
link->size = success;
/* Add the new link to the end of the list. */
if (tail)
tail->next = link;
else
list = link;
tail = link;
}
}
}
11.9 µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ ¸í·É
À̹ø Àý¿¡¼´Â ¾î¶»°Ô ¿¬°á¾ø´Â Åë½Å½ºÅ¸ÀÏ(SOCK_DGRAM°ú SOCK_RDM½ºÅ¸ÀÏ)À» »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇØ ¼¼úÇÑ´Ù. ÀÌ·¯ÇÑ ½ºÅ¸ÀÏÀ» »ç¿ëÇÏ¿© ÆÐŶ¾È¿¡ µ¥ÀÌÅ͸¦ ¹¾î ³Ö°í, °¢ ÆÐŶÀº µ¶¸³ÀûÀÎ Åë½ÅÀ» ÇÏ°Ô µÈ´Ù. ±×¸®°í °¢ ÆÐŶ¸¶´Ù ¸ñÀûÁö¸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù.
µ¥ÀÌÅͱ׷¥ ÆÐŶÀº ÆíÁö¿Í °°´Ù. ´ç½ÅÀº °³º°ÀûÀ¸·Î Çϳª¾¿ ¸ñÀûÁö¸¦ ¸í½ÃÇÏ¿© º¸³½´Ù. ±×°ÍµéÀº ¼ø ¼°¡ ¹Ù²î¾î µµÂøÇÒ ¼öµµ ÀÖ´Ù.
listen°ú acceptÇÔ¼ö´Â ºñ¿¬°á Åë½Å ½ºÅ¸ÀÏÀ» »ç¿ëÇÏ´Â ¼ÒÄÏ¿¡¼ »ç¿ëÇÒ ¼ö ¾ø´Ù.
11.9.1 µ¥ÀÌÅͱ׷¥ Àü¼Û
µ¥ÀÌÅͱ׷¥¼ÒÄÏÀ¸·Î µ¥ÀÌÅ͸¦ º¸³»´Â º¸Åë ¹æ¹ýÀº 'sys/socket.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Â sendtoÇÔ¼ö¸¦ »ç ¿ëÇÏ´Â °ÍÀÌ´Ù. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡ connect¸¦ È£ÃâÇÒ ¼ö ÀÖÁö¸¸, ³ªÁß¿¡ µ¥ÀÌÅÍÀü¼ÛÀ» À§ÇØ ±âº»°æ·Î ¸¦ ÇÑ ¹ø ¸í½ÃÇÑ´Ù. ¼ÒÄÏÀÌ ±âº»°æ·Î¸¦ °¡Áö¸é, send¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.(11.8.5.1Àý [µ¥ÀÌÅÍ Àü¼Û],169 ÂÊÀ» º¸¶ó) ¶ÇÇÑ ÆÐŶÀ» Àü¼ÛÇϱâ À§ÇØ write¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.(8.2Àý [I/O Ãß»ó], 105ÂÊÀ» º¸¶ó). addrÀμö¿¡ AF_UNSPECÀÇ ÁÖ¼ÒÆ÷¸ËÀ» »ç¿ëÇÏ¿© connect¸¦ È£ÃâÇÔÀ¸·Î½á ±âº»°æ·Î¸¦ Ãë¼ÒÇÒ ¼ö ÀÖ ´Ù. connectÇÔ¼ö¿¡ °üÇÑ ´õ ¸¹Àº Á¤º¸´Â 11.8.1Àý [¿¬°áÇϱâ] 166ÂÊÀ» º¸¶ó.
int sendto (int socket, void *buffer. size_t size, int flags, struct sockaddr *addr, size_t length) ÇÔ¼ö
sendtoÇÔ¼ö´Â ¸ñÀûÁö°¡ addr°ú lengthÀμö·Î ¸í½ÃµÇ¾î ÀÖ´Â socketÀ» ÅëÇÏ¿© ¹öÆÛ¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ Àü¼ÛÇÑ´Ù. sizeÀμö´Â Àü¼ÛÇÒ ¹ÙÀÌÆ® ¼ö¸¦ ¸»ÇÑ´Ù.
flags´Â send¿¡¼°ú °°Àº ¹æ¹ýÀ¸·Î ÇØ¼®µÈ´Ù; 11.8.5.3Àý [¼ÒÄÏ µ¥ÀÌÅÍ ¿É¼Ç], 170ÂÊÀ» º¸¶ó.
¹Ýȯġ¿Í ¿¡·¯»óŵµ ¿ª½Ã send¿Í ºñ½ÁÇÏ´Ù. ±×·¯³ª ½Ã½ºÅÛÀÌ ¿¡·¯¸¦ °ËÃâÇÏ°Ô ÇÒ ¼ö´Â ¾ø´Ù. ´ëºÎ ºÐÀÇ ¿¡·¯´Â ÆÐŶÀÌ ¾ø¾îÁö°Å³ª ¼ö½ÅÇÒ ÁÖ¼Ò°¡ ¸í½ÃµÇ¾î ÀÖÁö ¾ÊÀº °ÍÀÌ´Ù. ±×·¡¼ ´ç½ÅÀÇ OS´Â º¸ Åë ¿¡·¯°¡ ³ °ÍÀ» ¾ËÁö ¸øÇÒ °ÍÀÌ´Ù. ¿¹ÀüÀÇ È£Ãâ¿¡ °ü·ÃµÈ ¹®Á¦ ¶§¹®¿¡ sendto´Â ¿¡·¯°¡ ³µ´Ù°í ÇÒ ¼öµµ ÀÖ´Ù.
11.9.2 µ¥ÀÌÅͱ׷¥ ¼ö½Å
recvfromÇÔ¼ö´Â µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ¸·ÎºÎÅÍ ÆÐŶÀ» ÀÐ°í ¶ÇÇÑ ¾îµð¼ºÎÅÍ ¿Â °ÍÀÎÁö ¾Ë·ÁÁØ´Ù. ÀÌ ÇÔ¼ö´Â 'sys/socket.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
int recvfrom (int socket, void *buffer, size_t size, int flags, struct sockaddr *addr, size_t *length_ptr) ÇÔ¼ö
recvfromÇÔ¼ö´Â socket¼ÒÄÏÀ¸·ÎºÎÅÍ ÆÐŶÇϳª¸¦ Àоî buffer¶ó´Â ¹öÆÛ¿¡ ³Ö´Â´Ù. sizeÀμö´Â ÇÑ ¹ø ÀÐÀ» ¶§ ÃÖ´ëÀÇ ¹ÙÀÌÆ® ¼öÀÌ´Ù. ¸¸¾à ÆÐŶÀÌ size¹ÙÀÌÆ®º¸´Ù ´õ Å©¸é, ÆÐŶÀÇ ¾ÕºÎºÐ¸¸ ¾òÀ»¼ö ÀÖ°í specify flags¸¦ ¿øÇÏÁö ¾ÊÀ¸¸é »ç¿ëµÈ´Ù.(8.2Àý[I/O Primitives]À» º¸¶ó, 105ÂÊ).
¸¸¾à (¾îµð¼ºÎÅÍ ¿Ã °ÍÀÎÁö ¾Æ´Â °æ¿ì, ´©°¡ º¸³Â´øÁö ¶È°°ÀÌ Ãë±ÞÇϱ⠶§¹®¿¡) ´©°¡ ÆÐŶÀ» º¸³Â ´ÂÁö ¾Ë Çʿ䰡 ¾ø´Ù¸é recvfrom´ë½Å¿¡ ÆòźÇÑ recv¸¦ ¾µ ¼ö ÀÖ´Ù. (11.8.5.2Àý [µ¥ÀÌÅÍ ¼ö½Å], 169ÂÊ À» º¸¶ó)
11.9.3 µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ ¿¹Á¦
¿©±â¿¡ ÆÄÀÏÀ̸§°ø°£ÀÇ µ¥ÀÌÅͱ׷¥ ½ºÆ®¸²À» ÅëÇØ ¸Þ½ÃÁö¸¦ º¸³»´Â ¿¹Á¦ÇÁ·Î±×·¥ÀÇ ¼¼Æ®°¡ ÀÖ´Ù. Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹öÇÁ·Î±×·¥µé ¸ðµÎ°¡ ¼ÒÄÏÀ» ¸¸µé°í À̸§Áþ±â À§ÇÏ¿©, 11.4Àý [ÆÄÀÏ À̸§°ø°£]¿¡ ¼³ ¸íµÇ¾î ÀÖ´Â make_named_socket ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
¸ÕÀú ¿©±â ¼¹öÇÁ·Î±×·¥ÀÌ ÀÖ´Ù. ±×°ÍÀº ¸Þ½ÃÁö°¡ µµÂøÇÒ ¶§±îÁö °è¼Ó ±â´Ù¸®°í ¸Þ½ÃÁö°¡ ¿À¸é ´Ù ½Ã ¼Û½ÅÀÚ¿¡°Ô µÇµ¹·ÁÁÖ´Â °ÍÀ» ¹Ýº¹ÇÑ´Ù. ºÐ¸íÈ÷ Ưº°È÷ À¯¿ëÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´ÏÁö¸¸, ÀϹÝÀûÀÎ ¾Æ À̵ð¾î¸¦ º¸¿©ÁØ´Ù.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SERVER "/tmp/serversocket"
#define MAXMSG 512
int
main (void)
{
int sock;
char message[MAXMSG];
struct sockaddr_un name;
size_t size;
int nbytes;
/* Make the socket, then loop endlessly. */
sock = make_named_socket (SERVER);
while (1)
{
/* Wait for a datagram. */
size = sizeof (name);
nbytes = recvfrom (sock, message, MAXMSG, 0,
(struct sockaddr *) & name, &size);
if (nbytes < 0)
{
perror ("recfrom (server)");
exit (EXIT_FAILURE);
}
/* Give a diagnostic message. */
fprintf (stderr, "Server: got message: %s\n", message);
/* Bounce the message back to the sender. */
nbytes = sendto (sock, message, nbytes, 0,
(struct sockaddr *) & name, size);
if (nbytes < 0)
{
perror ("sendto (server)");
exit (EXIT_FAILURE);
}
}
}
11.9.4 µ¥ÀÌÅͱ׷¥ Àб⠿¹Á¦
¿©±â À§¿¡ ÀÖ´Â ¼¹öÇÁ·Î±×·¥¿¡ ¸Â´Â Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù.
±×°ÍÀº ¼¹ö¿¡°Ô µ¥ÀÌÅͱ׷¥À» ¼Û½ÅÇÏ°í³ª¼ ÀÀ´äÀ» ±â´Ù¸°´Ù. Ŭ¶óÀÌ¾ðÆ®¸¦ À§ÇÑ ¼ÒÄÏ¿¡´Â (¼¹ö¿Í °°ÀÌ) ÁÖ¾îÁø À̸§À» °¡Áö°í ÀÖÀ½À» ÁÖ½ÃÇ϶ó. ±×°ÍÀº ¼¹ö°¡ ¸Þ½ÃÁö¸¦ ¹Ù·Î Ŭ¶óÀÌ¾ðÆ®¿¡°Ô µÇµ¹ ¸®°Ô ÇÑ´Ù. ¼ÒÄÏÀÌ ¿¬°èµÈ ¿¬°á»óŸ¦ °¡ÁöÁö ¾Ê±â ¶§¹®¿¡, ¼¹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ À̸§À» ÂüÁ¶ÇÏ¿© ±× ·¸°Ô ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SERVER "/tmp/serversocket"
#define CLIENT "/tmp/mysocket"
#define MAXMSG 512
#define MESSAGE "Yow!!! Are we having fun yet?!?"
int
main (void)
{
externint make_named_socket (const char *name);
int sock;
char message[MAXMSG];
struct sockaddr_un name;
size_t size;
int nbytes;
/* Make the socket. */
sock = make_named_socket (CLIENT);
/* Initialize the server socket address. */
name.sun_family = AF_UNIX;
strcpy (name.sun_path, SERVER);
size = strlen (name.sun_path) + sizeof (name.sun_family);
/* Send the datagram. */
nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
(struct sockaddr *) & name, size);
if (nbytes < 0)
{
perror ("sendto (client)");
exit (EXIT_FAILURE);
}
/* Wait for a reply. */
nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
if (nbytes < 0)
{
perror ("recfrom (client)");
exit (EXIT_FAILURE);
}
/* Print a diagnostic message. */
fprintf (stderr, "Client: got message: %s\n", message);
/* Clean up. */
remove (CLIENT);
close (sock);
}
µ¥ÀÌÅͱ׷¥¼ÒÄÏ Åë½ÅÀº ºñ½Å·Ú¼ºÀÓÀ» ¸í½ÉÇ϶ó. ÀÌ ¿¹Á¦¿¡¼, ¸Þ½ÃÁö°¡ ¼¹ö¿¡ µµ´ÞÇÏÁö ¸øÇϰųª ¼¹ö°¡ ÀÀ´äÀ» ÇÏÁö ¾ÊÀ» Áö¶óµµ, Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ¸·¿¬È÷ ±â´Ù¸°´Ù. ¸¸¾à ¿øÇÑ´Ù¸é, ±×°ÍÀ» Á¾·á½ÃŰ°í ¸®¼Â½ÃŰ´Â ÇÁ·Î±×·¥À» À¯Àú°¡ ¼öÇàÇÏ¿©¾ß ÇÑ´Ù. ÀÚµ¿ÀûÀÎ ÇØ°á¹ýÀº select(8.6Àý [I/O±â ´Ù¸®±â],111ÂÊÀ» º¸¶ó)À» »ç¿ëÇÏ¿© ÀÀ´äÀÇ ½Ã°£Á¦ÇÑÀ» ¼³Á¤ÇÏ¿©, ½Ã°£Á¦ÇÑÀÌ ÃʰúµÇ¸é ¸Þ½ÃÁö¸¦ ÀçÀü ¼ÛÇϰųª ¼ÒÄÏÀ» ³¡³»°í Á¾·áÇÏ´Â °ÍÀÌ´Ù.
11.10 inetd µ¥¸ó
À§¿¡¼ µè±â¸¦ ÇÏ´Â ¼¹öÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹ýÀ» ¼³¸íÇß´Ù. ¾î¶² ¼¹ö´Â ±×°Í¿¡ Á¢¼ÓÇϱâ À§ÇØ ¹Ì¸® ¼öÇàµÇ°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÎÅÍ³ÝÆ÷Æ®¸¦ À§ÇÑ ¼ºñ½º¸¦ Á¦°øÇÏ´Â ´Ù¸¥ ¹æ¹ýÀº inetd µ¥¸óÇÁ·Î±×·¥ À» ÀÌ¿ëÇÏ¿© µè±â¸¦ Çϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. inetd´Â ¸í½ÃµÈ Æ÷Æ®ÀÇ ¼¼Æ®¿¡¼ÀÇ ¸Þ½ÃÁö¸¦ (select¸¦ »ç¿ë ÇÏ¿©) ±â´Ù¸®¸ç ¼öÇàµÇ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ±×°ÍÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§, (¸¸¾à ¼ÒÄϽºÅ¸ÀÏÀÌ ¿¬°áÀÌ ÇÊ ¿äÇϸé) ¿¬°áÀ» ¼ö¶ôÇÏ°í³ª¼, ÇØ´ç ¼¹öÇÁ·Î±×·¥À» ¼öÇàÇϵµ·Ï ÀÚ½ÄÇÁ·Î¼¼½º¸¦ ¸¸µé¾î ³½´Ù. '/etc/inetd.conf'ÆÄÀϳ»¿¡ Æ÷Æ®µé¿Í ÇÁ·Î±×·¥µéÀ» ¸í½ÃÇÑ´Ù.
11.10.1 inetd ¼¹öµé
inetd¿¡ ÀÇÇØ ¼öÇàµÇ´Â ¼¹öÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀº ¸Å¿ì °£´ÜÇÏ´Ù. ´©±º°¡ ÇØ´ç Æ÷Æ®·Î ¿¬°áÀ» ¿¬°áÇÏ·Á´Â ¶§¸¶´Ù, »õ·Î¿î ¼¹ö ÇÁ·Î¼¼½º°¡ ½ÃÀ۵ȴÙ. ¿¬°áÀº ´ÜÁö ÀÌ ¼ø°£¿¡¸¸ Á¸ÀçÇÑ´Ù. ¼ÒÄÏÀº ¼¹öÇÁ·Î¼¼½º¿¡¼ Ç¥ÁØ ÀÔ·Â ¼¼úÀÚ¿Í Ç¥ÁØ Ãâ·Â ¼¼úÀÚ (¼¼úÀÚ 0°ú 1)ó·³ µÈ´Ù. °¡²ûÀº ÇÁ·Î±×·¥ ÀÌ ÀϹÝÀûÀÎ I/O±â´ÉÀ» ÇÊ¿ä·Î ÇÒ ¶§µµ ÀÖ´Ù.; ½ÇÁ¦·Î, ¼ÒÄÏ¿¡ ´ëÇØ ¾Æ¹«°Íµµ ¸ð¸£´Â ¹ü¿ë ÇÊÅÍ ÇÁ·Î ±×·¥µµ inetd¿¡ ÀÇÇØ ¹ÙÀÌÆ® ½ºÆ®¸² ¼¹öó·³ µ¿ÀÛÇÒ ¼ö ÀÖ´Ù.
ºñ¿¬°á¼º Åë½Å ½ºÅ¸ÀÏÀÇ ¼¹ö¿¡µµ inetd¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¬°áÀÌ ÇÊ¿ä¾øÀ¸¹Ç·Î, ÀÌ·¯ÇÑ ¼¹öµéÀ» À§ÇØ inetd´Â ¿¬°áÀ» ¼ö¶ôÇÏ·Á´Â ½Ãµµ¸¦ ÇÏÁö ¾Ê´Â´Ù. ±×°ÍÀº ¹Ù·Î ¼¼úÀÚ 0À¸·ÎºÎÅÍ ¼ö½ÅµÈ µ¥ÀÌÅÍ ±×·¥ÆÐŶÀ» ÀÐÀ» ¼ö ÀÖ´Â ¼¹öÇÁ·Î±×·¥À» ½ÃÀÛÇÑ´Ù. ¼¹öÇÁ·Î±×·¥Àº ÇÑ ¿ä±¸¸¦ ´Ù·ê ¼ö ÀÖ°í Á¾·áÇÒ ¼ö ÀÖ´Ù. ¶Ç´Â ´õ ÀÌ»óÀÇ µµÂøÀÌ ¾øÀ» ¶§±îÁö ¿ä±¸¸¦ Àд °ÍÀ» °è¼ÓÇÏ°í³ª¼ Á¾·áÇÒ ¼öµµ ÀÖ´Ù. inetd¸¦ ¼³Á¤ÇÒ ¶§, À§ÀÇ µÎ°¡Áö ±â¼ú Áß ¾î¶² °ÍÀ» »ç¿ëÇÒ °ÍÀÎÁö ¸í½ÃÇØ¾ß ÇÑ´Ù.
11.10.2 inetd ¼³Á¤
'/etc/inetd.conf'ÆÄÀÏÀº inetd¿¡°Ô µéÀ» Æ÷Æ®¹øÈ£¿Í ¼öÇàµÉ ¼¹öÇÁ·Î±×·¥ÀÌ ¹«¾ùÀÎÁö ¸»ÇØÁØ´Ù. º¸Åë ÀÌ ÆÄÀÏÀÇ °¢ ¿ä¼Ò´Â ÇÑ ÁÙ¾¿ÀÌ´Ù. ±×·¯³ª, ±×°ÍÀ» ÈÀÌÆ®½ºÆäÀ̽º·Î ½ÃÀÛÇÏ´Â ¿ä¼ÒÀÇ Ã¹ ¹øÂ° ÁÙÀ» Á¦¿ÜÇÑ ¸ðµç ÁÙ·Î ³ª´ ¼ö ÀÖ´Ù. '#'·Î ½ÃÀÛÇÏ´Â ÁÙÀº ÁÖ¼®¹®ÀÌ´Ù.
¿©±â '/etc/inetd.conf'¾ÈÀÇ µÎ ±âº»ÀûÀÎ ¿ä¼Ò°¡ ÀÖ´Ù.
ftp stream tcp nowait root /libexec/ftpd ftpd
talk dgram udp wait root /libexec/talkd talkd
ÇÑ ¿ä¼Ò´Â ´ÙÀ½ Çü½ÄÀ» °¡Áø´Ù.
¼ºñ½º ½ºÅ¸ÀÏ ÇÁ·ÎÅäÄÝ ´ë±â »ç¿ëÀÚ¸í ÇÁ·Î±×·¥ Àμö
¼ºñ½º ºÎºÐÀº ÀÌ ÇÁ·Î±×·¥ÀÌ ¾î¶² ¼ºñ½º¸¦ Á¦°øÇÏ´Â Áö¸¦ ¸»ÇÑ´Ù. ±×°ÍÀº '/etc/services'¾È¿¡ ¼ ºñ½ºÀÇ À̸§ÀÌ Á¤ÀǵǾî ÀÖÀ» °ÍÀÌ´Ù. inetd´Â ÀÌ ¿ä¼Ò¸¦ À§ÇØ µéÀ» ¾î¶² Æ÷Æ®¸¦ »ç¿ëÇÒ °ÍÀΰ¡ °áÁ¤ Çϴµ¥ ¼ºñ½º¸¦ »ç¿ëÇÑ´Ù.
½ºÅ¸Àϰú ÇÁ·ÎÅäÄÝ ºÎºÐÀº Åë½Å½ºÅ¸Àϰú ¼ÒÄÏÀ» µè´Âµ¥ »ç¿ëµÇ´Â ÇÁ·ÎÅäÄÝÀ» ¸í½ÃÇÑ´Ù. ½ºÅ¸ÀÏÀº 'SOCK_'ÀÌ ºüÁö°í, ¼Ò¹®ÀÚ·Î º¯È¯µÈ Åë½Å½ºÅ¸ÀÏÀÇ À̸§ÀÌ´Ù. ¿¹¸¦ µé¸é stream ¶Ç´Â dgramÀÌ´Ù. ÇÁ ·ÎÅäÄÝÀº '/etc/protocols'¿¡ ³ª¿µÈ ÇÁ·ÎÅäÄÝ Áß ÇϳªÀÌ´Ù. ÀüÇüÀûÀÎ ÇÁ·ÎÅäÄÝÀ̸§Àº ¹ÙÀÌÆ® ½ºÆ®¸² Åë½ÅÀ» À§ÇÑ 'tcp'¿Í ºñ½Å·Ú¼º µ¥ÀÌÅͱ׷¥À» À§ÇÑ 'udp'°¡ ÀÖ´Ù.
´ë±â ºÎºÐÀº 'wait' ¶Ç´Â 'nowait' Áß ÇϳªÀÌ´Ù. ¸¸¾à Åë½Å½ºÅ¸ÀÏÀÌ ºñ¿¬°á¼ºÀ̰í, ¼¹ö°¡ ½ÃÀ۽ÿ¡ ¸¸ ¸¹Àº ´ÙÁß ¿ä±¸¸¦ ´Ù·é´Ù¸é 'wait'À» »ç¿ëÇ϶ó. ¸¸¾à inetd°¡ °¢ ¸Þ½ÃÁö³ª ¿ä±¸°¡ µé¾î ¿Ã ¶§¸¶´Ù »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÒ °æ¿ì 'nowait'¸¦ »ç¿ëÇ϶ó. ¸¸¾à ½ºÅ¸ÀÏÀÌ ¿¬°á¼ºÀÌ¸é ´ë±â ºÎºÐÀº 'nowait'¸¦ ½á¶ó.
»ç¿ëÀÚ¸íÀº ¼¹ö¸¦ ¼öÇàÇÏ´Â »ç¿ëÀÚÀÇ À̸§ÀÌ´Ù. inetd´Â root·Î¼ ¼öÇàµÈ´Ù. ±×·¡¼ ¸¶À½´ë·Î ±× ÀÚ½ÄÀÇ »ç¿ëÀÚID¸¦ ¼¼Æ®ÇÒ ¼ö ÀÖ´Ù. °¡´ÉÇÏ¸é »ç¿ëÀÚ¸í¿¡ 'root'¸¦ ÇÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.; ±×·¯³ª telnet °ú ftp°°Àº ¾î¶² ¼¹ö´Â »ç¿ëÀÚ À̸§°ú ¾ÏÈ£¸¦ Àд´Ù. ÀÌ·¯ÇÑ ¼¹öµéÀº, ³×Æ®¿öÅ©·ÎºÎÅÍ ¿À´Â µ¥ÀÌ ÅÍ¿¡ ÀÇÇÑ ¸í·É °°ÀÌ ·Î±×ÀÎÀ» ÇÒ ¼ö ÀÖµµ·Ï óÀ½¿¡ root°¡ µÉ Çʿ䰡 ÀÖ´Ù.
ÇÁ·Î±×·¥ ºÎºÐ°ú Àμö ºÎºÐÀº ¼¹ö¸¦ ½ÃÀÛÇÒ ¶§ ¼öÇàµÇ´Â ¸í·É¾î¸¦ ¸í½ÃÇÑ´Ù. ÇÁ·Î±×·¥Àº ¼öÇà°¡´É ÇÑ ÆÄÀÏÀÇ Àý´ë °æ·ÎÀÇ ÆÄÀÏÀ̸§À̾î¾ß ÇÑ´Ù. Àμö´Â ÈÀÌÆ®½ºÆäÀ̽º·Î ±¸ºÐµÈ ´Ü¾î·Î ±¸¼ºµÇ¾î, ÇÁ ·Î±×·¥ÀÇ ¸í·É¾î¶óÀÎ Àμö°¡ µÈ´Ù. ÀμöÀÇ Ã¹ ¹øÂ° ´Ü¾î´Â Àμö 0À¸·Î (µð·ºÅ丮 ¾øÀÌ) ÇÁ·Î±×·¥ÀÇ À̸§ ±×ÀÚü·Î µÈ´Ù.
¸¸¾à '/etc/inetd.conf'¸¦ ¼öÁ¤Çϸé, inetdÇÁ·Î¼¼½º¿¡°Ô SIGHUP½ÅÈ£¸¦ inetd¿¡°Ô ÆÄÀÏÀ» ´Ù½Ã Àаí, »õ·Î¿î ³»¿ëÀ» ¾ò°Ô ÇÏ¿©¾ß ÇÑ´Ù. ps¸¦ »ç¿ëÇÏ¿© inetdÀÇ ÇÁ·Î¼¼½ºID°¡ ¹Ù²î¾ú´ÂÁö È®ÀÎÇÏ¸é µÈ´Ù.
11.11 ¼ÒÄÏ ¿É¼Ç
ÀÌ Àå¿¡¼´Â ¼ÒÄÏÀÇ Çൿ°ú ±× ¹Ø¿¡ ÀÖ´Â Åë½Å ÇÁ·ÎÅäÄÝÀ» º¯°æÇÏ´Â ¿©·¯ °¡Áö ¿É¼ÇÀ» ¼³Á¤Çϰí Àд ¹æ¹ýÀ» ¼¼úÇÑ´Ù. ¼ÒÄϿɼÇÀ» ´Ù·ê ¶§, ¿É¼ÇÀÌ ¼ÓÇÏ´Â ·¹º§À» ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù. À̰ÍÀº ¿É¼Ç ÀÌ ¼ÒÄÏÀÎÅÍÆäÀ̽º¿¡ Àû¿ëµÇ´Â Áö, Àú¼öÁØ Åë½Å ÇÁ·ÎÅäÄÝ ÀÎÅÍÆäÀ̽º¿¡ Àû¿ëµÇ´Â Áö¸¦ ¼¼úÇÑ´Ù.
11.11.1 ¼ÒÄÏ ¿É¼Ç ÇÔ¼ö
¿©±â¿¡ ¼ÒÄϿɼÇÀ» º¯°æÇÏ°í ½ÃÇèÇÏ´Â ÇÔ¼ö°¡ ÀÖ´Ù. 'sys/socket.h'¾È¿¡ ±×°ÍµéÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
int getsockopt (int socket, int level, int optname, void *optval, size_t *optlen_ptr) ÇÔ¼ö
getsockoptÇÔ¼ö´Â socket¼ÒÄÏÀÇ level·¹º§ÀÇ optname ¿É¼ÇÀÇ ¿É¼Ç°ª¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò´Â´Ù.
¿É¼Ç °ªÀº optvalÀÌ °¡¸®Å°´Â ¹öÆÛ¿¡ ÀúÀåµÈ´Ù. È£Ãâ Àü¿¡, ÀÌ ¹öÆÛÀÇ Å©±âÀÎ *optlen_ptr¾È¿¡ Á¦°øÇØ ¾ß ÇÑ´Ù; ¹ÝȯÇÒ ¶§, ½ÇÁ¦·Î ¹öÆÛ¿¡ ÀúÀåµÈ Á¤º¸ÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ´ã°í ÀÖ´Ù.
´ëºÎºÐÀÇ ¿É¼ÇÀº optval¹öÆÛ¸¦ Á¤¼ö°ªÀ¸·Î ÇØ¼®µÈ´Ù.
¼º°ø½Ã getsockoptÀÇ ½ÇÁ¦¹Ýȯ°ªÀº 0ÀÌ°í ½ÇÆÐ½Ã -1ÀÌ´Ù. ´ÙÀ½¿¡ errno¿¡·¯Á¶°ÇÀÌ Á¤ÀǵǾî ÀÖ ´Ù.
EBADF socketÀμö°¡ À¯È¿ÇÑ ÆÄÀÏ ¼¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTSOCK ¼¼úÀÚ socketÀÌ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù.
ENOPROTOOPT optnameÀÌ ÁÖ¾îÁø ·¹º§¿¡ ¸ÂÁö ¾Ê´Ù.
int setsockopt (int socket, int level, int optname, void *optval, size_t optlen) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â socket¼ÒÄÏÀÇ level·¹º§¿¡ ¼ÒÄÏ¿É¼Ç optnameÀ» ¼³Á¤Çϴµ¥ »ç¿ëµÈ´Ù. ¿É¼ÇÀÇ °ªÀº optlen Å©±â¸¦ °¡Áø optval¹öÆÛ¿¡ Àü´ÞµÈ´Ù. setsockoptÀÇ ¹Ýȯġ¿Í ¿¡·¯ÄÚµå´Â getsockopt°ú °°´Ù.
11.11.2 ¼ÒÄÏ-·¹º§ ¿É¼Ç
int SOL__SOCKET »ó¼ö
ÀÌ Àý¿¡ ¼¼úµÇ¾î ÀÖ´Â ¼ÒÄÏ·¹º§ ¿É¼ÇÀ» ´Ù·ç·Á¸é, getsockopt ³ª setsocketÀÇ levelÀμö·Î ÀÌ »ó¼ö¸¦ »ç¿ëÇ϶ó. ¿©±â¿¡ socket-level ¿É¼Ç À̸§ÀÇ Ç¥°¡ ÀÖ´Ù.; ¸ðµÎ 'sys/socket.h'Çì´õ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ ´Ù.
SO_DEBUG
ÇÏÀ§ ÇÁ·ÎÅäÄÝ ¸ðµâÀÇ µð¹ö±ë Á¤º¸ÀÇ ÀúÀåÇÒ °ÍÀΰ¡ ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù. ±×°ªÀº intÇüÀ» °¡Áø´Ù; 0ÀÌ ¾Æ´Ñ °ªÀº ÀúÀåÇϰڴٴ °ÍÀ» ÀǹÌÇÑ´Ù.
SO_REUSEADDR
ÀÌ ¿É¼ÇÀº bind( 11.3.2Àý [ÁÖ¼Ò ¼³Á¤], 152ÂÊÀ» º¸¶ó)°¡ ÀÌ ¼ÒÄÏÀÇ Áö¿ªÁÖ¼Ò¸¦ Àç»ç¿ëÇÏ´Â °ÍÀ» Çã¶ô ÇÒ °ÍÀÎÁö ¿©ºÎ¸¦ Á¦¾îÇÑ´Ù. ¸¸¾à ÀÌ ¿É¼ÇÀ» °¡´ÉÇϵµ·Ï ÇÑ´Ù¸é, °°Àº ÀÎÅÍ³Ý Æ÷Æ®·ÎºÎÅÍ µÎ ¼ÒÄÏ À» °¡Áú¼ö ÀÖ°Ô µÈ´Ù; ±×·¯³ª, ½Ã½ºÅÛÀº ÀÎÅͳÝÀ» È¥¶õ½ÃŰ´Â µÎ º°°³ÀÇ À̸§À» °¡Áø ¼ÒÄÏÀ» »ç¿ëÇÏ ´Â °ÍÀ» Çã¶ôÇÏÁö ¾Ê´Â´Ù. ÀÌ ¿É¼ÇÀÌ ÀÖ´Â ÀÌÀ¯´Â FTP°°Àº »óÀ§ ÇÁ·ÎÅäÄÝÀÌ °°Àº ¼ÒÄϹøÈ£ÀÇ Àç»ç ¿ëÀ» À¯ÁöÇϱ⸦ ¿øÇϱ⠶§¹®ÀÌ´Ù. °ªÀº intÇüÀ» °¡Áö¸ç, 0ÀÌ ¾Æ´Ñ ¼ö´Â "±×·¸´Ù(yes)"¸¦ ÀǹÌÇÑ´Ù.
SO_KEEPALIVE
ÀÌ ¿É¼ÇÀº ÇÏÀ§ ÇÁ·ÎÅäÄÝÀÌ ÁÖ±âÀûÀ¸·Î ¸Þ½ÃÁö¸¦ ¿¬°áµÈ ¼ÒÄÏÀ¸·Î Àü¼ÛÇÒ °ÍÀÎÁö ¿©ºÎ¸¦ Á¦¾îÇÑ´Ù. ¸¸¾à ¼·Î ÀÌ·¯ÇÑ ¸Þ½ÃÁöÀÇ ÀÀ´äÀ» ½ÇÆÐÇÏ¸é ¿¬°áÀÌ ²÷¾îÁöµµ·Ï ÇÑ´Ù. °ªÀº intÇüÀ̰í 0ÀÌ ¾Æ´Ñ °ªÀº "±×·¸´Ù"¸¦ ÀǹÌÇÑ´Ù.
SO_DONTROUTE
ÀÌ ¿É¼ÇÀº ¼Û½ÅÇÏ´Â ¸Þ½ÃÁö°¡ ÀÏ¹Ý ¸Þ½ÃÁö ¶ó¿ìÆÃ ±â´ÉÀ» ¿ìȸÇÒ °ÍÀÎÁö ¿©ºÎ¸¦ Á¦¾îÇÑ´Ù. ¸¸¾à ¼³ Á¤µÇ¸é, ¸Þ½ÃÁö´Â Á÷Á¢ ³×Æ®¿öÅ© ÀÎÅÍÆäÀ̽º·Î º¸³»Áø´Ù. °ªÀº intÇüÀ̸ç 0ÀÌ ¾Æ´Ñ°ªÀº "±×·¸´Ù"ÀÇ ÀǹÌÀÌ´Ù.
SO_LINGER
ÀÌ ¿É¼ÇÀº ½Å·Úµµ ÀÖ´Â Àü´ÞÀ» º¸ÀåÇÏ´Â ¾î¶² ÇüÅÂÀÇ ¼ÒÄÏÀÌ ´ÝÈú ¶§ ¿©ÀüÈ÷ Àü¼ÛµÇÁö ¸øÇÑ ¸Þ½ÃÁö µéÀ» °¡Áö°í ÀÖÀ» ¶§, ¹«¾ùÀÌ ÀϾ °ÍÀÎÁö¸¦ ¸í½ÃÇÑ´Ù. 11.7.2Àý [¼ÒÄÏ ´Ý±â], 165ÂÊÀ» º¸¶ó. °ªÀº ±¸Á¶Ã¼ lingerÀÌ´Ù.
struct linger ÀÚ·áÇü
ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½ ¸â¹ö¸¦ °¡Áø´Ù:
int l_onoff
ÀÌ ºÎºÐÀº Âü°ÅÁþÀ¸·Î ÇØ¼®µÈ´Ù. ¸¸¾à 0ÀÌ ¾Æ´Ï¸é, close´Â µ¥ÀÌÅͰ¡ Àü´ÞµÇ°Å³ª ½Ã°£Á¦ÇÑÀÌ °æ°ú µÉ ¶§±îÁö ÇÁ·Î±×·¥ÀÇ ¼öÇàÀÌ ÁߴܵȴÙ.
int l_linger
À̰ÍÀº ÃÊ´ÜÀ§·Î ½Ã°£Á¦ÇÑÀ» ¸í½ÃÇÑ´Ù.
SO_BROADCAST
ÀÌ ¿É¼ÇÀº µ¥ÀÌÅͱ׷¥ÀÌ ¼ÒÄÏÀ¸·ÎºÎÅÍ ºê·Îµåij½ºÆ®µÉ °ÍÀÎÁö ¿©ºÎ¸¦ Á¦¾îÇÑ´Ù. °ªÀº intÇüÀ̰í 0ÀÌ ¾Æ´Ñ °ªÀº "±×·¸´Ù"¸¦ ÀǹÌÇÑ´Ù.
SO_OOBINLINE
¸¸¾à ÀÌ ¿É¼ÇÀÌ ¼³Á¤µÇ¸é, ¼ÒÄÏ¿¡ ¼ö½ÅµÈ out-of-band µ¥ÀÌÅͰ¡ º¸Åë ÀԷ ť¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ÀÌ°Í Àº MSG_OOBÇ÷¢ ¸í½Ã ¾øÀÌ read³ª recv¸¦ »ç¿ëÇÏ¿© ±×°ÍÀ» ÀÐÀ»¼ö ÀÖµµ·Ï ÇÑ´Ù. 11.8.8Àý [Out-of-Band µ¥ÀÌÅÍ], 173ÂÊÀ» º¸¶ó. °ªÀº Á¤¼öÇüÀ̸ç 0ÀÌ ¾Æ´Ñ °ªÀº "±×·¸´Ù"¸¦ ÀǹÌÇÑ´Ù.
SO_SNDBUF
ÀÌ ¿É¼ÇÀº Ãâ·Â¹öÆÛÀÇ Å©±â¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù. °ªÀº size_tÇüÀ̰í, ¹ÙÀÌÆ® Å©±âÀÌ´Ù.
SO_RCVBUF
ÀÌ ¿É¼ÇÀ¸ ÀԷ¹öÆÛÀÇ Å©±â¸¦ ¾ò°Å³ª ¼³Á¤ÇÑ´Ù. °ªÀº size_tÇüÀ̰í, ¹ÙÀÌÆ® Å©±âÀÌ´Ù.
SO_STYLE
SO_TYPE
ÀÌ ¿É¼ÇÀº getsockopt¿¡¸¸ »ç¿ëµÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×°ÍÀº ¼ÒÄÏÀÇ Åë½Å ½ºÅ¸ÀÏÀ» ¾ò´Âµ¥ »ç¿ëµÈ´Ù. SO_TYPEÀº ÀüÅëÀûÀÎ À̸§À̰í SO_STYLEÀº GNU¿¡¼ äÅÃÇÑ À̸§ÀÌ´Ù. °ªÀº intÇüÀ̰í, Åë½Å½º ŸÀÏÀ» ³ªÅ¸³½´Ù. 11.2Àý [Åë½Å ½ºÅ¸ÀÏ], 150ÂÊÀ» º¸¶ó.
SO_ERROR
ÀÌ ¿É¼ÇÀº getsockopt¿¡¸¸ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼ÒÄÏÀÇ ¿¡·¯»óŸ¦ ¸®¼ÂÇϴµ¥ »ç¿ëµÈ´Ù. °ªÀº intÇüÀ̰í Àü¹øÀÇ ¿¡·¯ »óŸ¦ ³ªÅ¸³½´Ù.
11.12 ³×Æ®¿öÅ© µ¥ÀÌÅͺ£À̽º
¸¹Àº ½Ã½ºÅÛÀº ½Ã½ºÅÛ °³¹ßÀڵ鿡°Ô ¾Ë·ÁÁø ³×Æ®¿öÅ© ¸®½ºÆ®¸¦ ±â·ÏÇÏ´Â µ¥ÀÌÅͺ£À̽º¸¦ °¡Áö°í ÀÖ´Ù. À̰ÍÀº º¸Åë '/etc/networks' ¶Ç´Â ³×ÀÓ¼¹öÀÇ °°Àº ÆÄÀÏÀ» À¯ÁöÇÑ´Ù. ÀÌ µ¥ÀÌÅͺ£À̽º´Â route °°Àº ¶ó¿ìÆÃ ÇÁ·Î±×·¥¿¡¼ À¯¿ëÇÏ´Ù. ±×·¯³ª ³×Æ®¿öÅ©¸¦ ÅëÇØ ´Ü¼øÈ÷ Åë½ÅÇÏ´Â ÇÁ·Î±×·¥¿¡°Ô´Â º° Çʿ䰡 ¾ø´Ù. ¿ì¸®´Â 'netdb.h'¿¡ ¼±¾ðµÈ ÀÌ µ¥ÀÌÅͺ£À̽º Á¢±Ù ÇÔ¼ö¸¦ º¼ °ÍÀÌ´Ù.
struct netent ÀÚ·áÇü
ÀÌ ÀÚ·áÇüÀº ³×Æ®¿öÅ© µ¥ÀÌÅÍ º£À̽ºÀÇ ¿ä¼Ò¿¡ °üÇÑ Á¤º¸¸¦ Ç¥ÇöÇϴµ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº ´ÙÀ½ ¸ã¹ö ¸¦ °¡Áø´Ù.
char *n_name
À̰ÍÀº ³×Æ®¿öÅ©ÀÇ °ø½ÄÀûÀÎ À̸§ÀÌ´Ù.
char **n_aliases
³×Æ®¿öÅ©ÀÇ ¶Ç´Ù¸¥ À̸§µéÀÌ ¹®ÀÚ¿ÀÇ º¤ÅÍó·³ Ç¥ÇöµÇ¾î ÀÖ´Ù. ³ÎÆ÷ÀÎÅÍ·Î ¹è¿ÀÌ ³¡³´Ù.
int n_addrtype
À̰ÍÀº ³×Æ®¿öÅ© ¹øÈ£ÀÇ Á¾·ùÀÌ´Ù.; À̰ÍÀº ÀÎÅÍ³Ý ³×Æ®¿öÅ©¿¡ ´ëÇØ Ç×»ó AF_INETÀÌ´Ù.
unsigned long int n_net
À̰ÍÀº ³×Æ®¿öÅ© ¹øÈ£ÀÌ´Ù. ³×Æ®¿öÅ© ¹øÈ£´Â È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼·Î ¹ÝȯµÈ´Ù. 11.5.5Àý [¹ÙÀÌÆ® ¼ø ¼], 161ÂÊÀ» º¸¶ó.
ƯÁ¤ ³×Æ®¿öÅ©¿¡ °üÇÑ Á¤º¸¸¦ À§ÇØ ³×Æ®¿öÅ© µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇϱâ À§ÇØ getnetbyname ¶Ç´Â getnetbyaddrÇÔ¼ö¸¦ »ç¿ëÇ϶ó. Á¤º¸´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¿¡ Á¤º¸°¡ ¹ÝȯµÈ´Ù.; ¸¸¾à ±×°ÍÀ» Àú ÀåÇÒ Çʿ䰡 ÀÖÀ¸¸é ±× Á¤º¸¸¦ º¹»çÇØµÎ¾î¾ß ÇÑ´Ù.
struct netent * getnetbyname (const char *name) ÇÔ¼ö
getnetbynameÇÔ¼ö´Â nameÀ̶ó´Â ³×Æ®¿öÅ©¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ±×¿Í °°Àº ³×Æ®¿öÅ©°¡ ¾ø À¸¸é ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
struct netent * getnetbyaddr (long net, int type) ÇÔ¼ö
getnetbyaddrÇÔ¼ö´Â type¶ó´Â Á¾·ù¿Í net¶ó´Â ¼ýÀÚ¸¦ °¡Áø ³×Æ®¿öÅ©¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù. ÀÎÅÍ ³Ý ³×Æ®¿öÅ©ÀÇ Á¾·ù¸¦ À§Çؼ AF_INET°ªÀ» ¸í½ÃÇØ¾ß ÇÑ´Ù. getnetbyaddrÀº ¸¸¾à ±×·¯ÇÑ ³×Æ®¿öÅ© °¡ ¾øÀ¸¸é ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. ¶ÇÇÑ setent, getnetent ¿Í endnetent¸¦ »ç¿ëÇÏ¿© ³×Æ®¿öÅ© µ¥ÀÌÅÍ º£À̽º¸¦ ÀÏÀÏÀÌ »ìÇʼö ÀÖ´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§´Â ÁÖÀÇÇ϶ó. ±×°ÍµéÀº ÀçÁøÀÔ¼ºÀÌ ¾ø±â ¶§¹® ÀÌ´Ù.
void setnetent (int stayopen) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ³×Æ®¿öÅ© µ¥ÀÌÅͺ£À̽º¸¦ ¸Ç¾ÕºÎÅÍ ÀÐÀ»¼ö ÀÖµµ·Ï ÇÑ´Ù. ¸¸¾à stayopenÀμö°¡ 0ÀÌ ¾Æ´Ï ¸é, Ç÷¢À» ¼¼Æ®ÇÏ¿© ÃßÈÄÀÇ getnetbynameÀ̳ª getnetbyaddr È£ÃâÀÌ (º¸Åë ±× ÇÔ¼öµéÀÌ ´ÝÀ¸¹Ç·Î)µ¥ ÀÌÅͺ£À̽º¸¦ ´ÝÁö ¾Êµµ·Ï ÇÑ´Ù. ¸¸¾à °¢ È£Ãâ½Ã µ¥ÀÌÅͺ£À̽º¸¦ ´Ù½Ã ¿©´Â °ÍÀ» ÇÇÇÏ¿© ±×·¯ÇÑ ÇÔ ¼ö¸¦ ¿©·¯¹ø È£ÃâÇÒ ¶§ ¸Å¿ì À¯¿ëÇÏ´Ù.
struct netent * getnetent (void) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ³×Æ®¿öÅ© µ¥ÀÌÅͺ£À̽ºÀÇ ´ÙÀ½ ¿ä¼Ò¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ´õ ÀÌ»óÀÇ ¿ä¼Ò°¡ ¾øÀ¸¸é ³ÎÆ÷ÀÎ Å͸¦ ¹ÝȯÇÑ´Ù.
void endnetent (void) ÇÔ¼ö
ÀÌ ÇÔ¼ö´Â ³×Æ®¿öÅ© µ¥ÀÌÅÍ º£À̽º¸¦ ´Ý´Â´Ù.