· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
CSocketFAQ

C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ


±èÇѼö Miryna7@yahoo.com

2003.11.30

Unix/Linux ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇϽô ºÐµéÀÌ °¡Àå ¸¹ÀÌ °ü½ÉÀ» °®´Â ºÐ¾ß´Â ¾Æ¹«·¡µµ ¼ÒÄÏ Åë½Å ºÐ¾ß°¡ ¾Æ´Ò±î »ý°¢ÀÌ µË´Ï´Ù. ±×·¯³ª ÈǸ¢ÇÑ ±³°ú¼­¿Íµµ °°Àº ¼­ÀûµéÀÌ Á¸ÀçÇÔ¿¡µµ ºÒ±¸ÇÏ°í °æÇèÀڵ鸸ÀÌ ¾Ë°í ÀÖ´Â ÀÌ·± Àú·± ¹®Á¦ ÇØ°áÃ¥µéÀ» óÀ½ ½ÃÀÛ ÇÏ´Â ºÐµé¿¡°Ô Á¦°øÇص帮°íÀÚ C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ¸¦ Á¦ÀÛÇÕ´Ï´Ù. ÀÌ°ÍÀº ¾î´À ´©±¸ ÇѸíÀÇ ÀúÀÛ¹°ÀÌ ¾Æ´Ñ ¿©·¯ ¸ðµÎÀÇ °øµ¿ ÀúÀÛ¹°ÀÔ´Ï´Ù. ºÎµð ÀÌ ÀÛÀº ½ÃÀÛÀ¸·Î ºÎÅÍ Ä¿´Ù¶õ Unix/Linux °øµ¿Ã¼¸¦ Å°¿ö³ª°¡½Ã±æ ±â¿øÇÕ´Ï´Ù.


Contents

1. ÀÏ¹Ý Á¤º¸
1.1. C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ´Â ¾î¶»°Ô °ü¸® µÇ³ª¿ä?
1.2. º» FAQ´Â ´©±¸¸¦ À§ÇÑ °ÍÀԴϱî?
1.3. º» FAQ¸¦ ÀÌ¿ëÇÏ´Â ÀúÀÛ±ÇÀº ¾î¶»°Ô µË´Ï±î?
2. TCP/IP Åë½Å
2.1. TCP/IP Åë½ÅÀÇ °¡Àå Ä¿´Ù¶õ Ư¡Àº ¹«¾ùÀԴϱî.
2.2. TCP/IP ÇÁ·Î±×·¡¹Ö Ãʺ¸ÀÚÀÔ´Ï´Ù. Ã¥À̳ª »çÀÌÆ® Ãßõ ºÎŹµå¸³´Ï´Ù.
3. C/S ÇÁ·Î±×·¡¹Ö
3.1. SUN Solaris¿¡¼­ ÄÄÆÄÀÏÀº Á¦´ë·Î µÇ³ª ¸µÅ©½Ã ¿¡·¯°¡ ³³´Ï´Ù.
3.1.1. ¼ÒÄÏÀÇ Á¢¼ÓÇØÁ¦´Â ¾î¶»°Ô ¾Ë¼ö°¡ ÀÖ½À´Ï±î.?
3.2. ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍ°¡ ´Ù¸£°Ô ³ªÅ¸³³´Ï´Ù.
3.3. ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é Á¢¼ÓÀÌ ÀÚµ¿À¸·Î ²÷±é´Ï´Ù.
3.4. bind() È£Ãâ½Ã "address already in use" ¿¡·¯°¡ ¹ß»ýÇÑ ÇÕ´Ï´Ù.
3.5. Á¦ ¼­¹ö¸¦ µ¥¸ó ¸ðµå·Î µ¿ÀÛ½ÃÅ°°í ½Í½À´Ï´Ù.
3.6. ¸®¸ðÆ® ½Ã½ºÅÛÀÇ MAC ÁÖ¼Ò¸¦ ¾Ë°í ½Í½À´Ï´Ù.
3.7. ƯÁ¤ ¼­¹ö¿¡ Á¢¼Ó½Ã "connection refused"¶ó´Â ¿¡·¯ ¸Þ½ÃÁö°¡ ³ª¿É´Ï´Ù.
3.8. °³º° »ç¿ëÀÚ(Á¢¼Ó)¿¡ ´ëÇÑ °ü¸®¿¡ ´ëÇÑ °³³äµµ´Â ¾î¶»°Ô ±×¸®½Ã³ª¿ä.?
3.9. ¼­¹ö ÇÁ·Î±×·¥ Á¦ÀÛ¿¡ ´ëÇÑ »ç·Ê¸¦ µé¾î ÁÖ¼¼¿ä.
4. ¼­¹ö ¸ðµ¨(SELECT/POLL/FORK/THREAD)
4.1. select()´Â ¹«¾ùÀΰ¡¿ä.?
4.2. select()¸¦ ÀÌ¿ëÇÑ ´ÙÁß¼­¹ö ±¸¼ºÀº ¾î¶»°Ô Çϳª¿ä.?
4.3. select()°¡ ºí¶ô(Block) ´çÇÕ´Ï´Ù.
4.4. select()¿¡¼­ ¼³Á¤ÇÑ struct timeval *timeout °ªÀÌ º¯°æµÇ´Â°Í °°½À´Ï´Ù.
4.5. select()¿¡¼­ »ó´ëÆíÀÇ Á¢¼Ó ÇØÁ¦´Â ¾î¶»°Ô ÆÇ´ÜÇÒ¼ö°¡ ÀÖ³ª¿ä.?
4.6. connect() È£Ãâ½Ã ¼­¹ö°¡ ÀÀ´äÇÏÁö ¾ÊÀ» °æ¿ì ÀϽÃÀûÀÎ Áö¿¬ÀÌ ¹ß»ýÇÕ´Ï´Ù.
4.7. À§ÀÇ ¹æ¹ýÀ» µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã¿¡µµ Àû¿ëÀÌ °¡´ÉÇÑ°¡¿ä.?
4.8. send()¸¦ È£ÃâÇÏ¿© µ¥ÀÌÅÍ Àü¼Û½Ã PIPE ½Ã±×³ÎÀÌ ¹ß»ýÇÕ´Ï´Ù.
4.9. select()¸¦ ÀÌ¿ëÇߴµ¥ CPU »ç¿ë·®ÀÌ °ÆÁ¤µË´Ï´Ù.
4.10. select()¸¦ ÀÌ¿ëÇϴµ¥ °¡²û CPU°¡ 100%¿¡ À̸¨´Ï´Ù.
4.11. select()°¡ ¼ö¿ë°¡´ÉÇÑ ÃÖ´ë fd°ªÀº ¾ó¸¶ÀԴϱî.?
4.12. select()¸¦ ÀÌ¿ëÇØ ½Ã¸®¾ó ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ°¡¿ä.?
4.13. select()¸¦ ÀÌ¿ëÇÑ ¸Þ½ÃÁöÅ¥°¡ °¡´ÉÇÑ°¡¿ä.?
4.14. ¼­¹ö ÇÁ·Î±×·¥¿¡ Á»ºñ ÇÁ·Î¼¼¼­°¡ »ý±é´Ï´Ù.
5. HTTP ÇÁ·ÎÅäÄÝ
5.1. HTTP ÇÁ·Î±×·¥Àº ¾î¶»°Ô ½ÃÀÛÇØ¾ß Çϳª¿ä.?
5.1.1. HTTP¸¦ ÅëÇÏ¿© ÆÄÀÏ ¼Û¼ö½ÅÀÌ °¡´ÉÇÑ°¡¿ä.?
5.2. HTTP Åͳθµ(TUNNELING)Àº ¹«¾ùÀΰ¡¿ä.?
5.3. HTTP 3-4°³ ´õ ´Ù·çÀÚ
6. À̱âÁ¾°£ÀÇ µ¥ÀÌÅÍ ¼Û/¼ö½Å
6.1. À̱âÁ¾°£ÀÇ µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã ÀÌ»óÇÑ µ¥ÀÌŸ°¡ È®Àε˴ϴÙ.
6.2. ±¸Á¶Ã¼ ¼±¾ð½Ã Å©±â°¡ ´Ù¸£°Ô ³ª¿É´Ï´Ù.(¹ÙÀÌÆ® Æеù)
6.3. XDRÀº ¹«¾ùÀΰ¡¿ä.?
7. º¸¾ÈÇÁ·Î±×·¡¹Ö
7.1. SSL
7.2. PKI
8. UDP
8.1. UDP
8.2. BROADCAST
8.3. MULTICAST



1. ÀÏ¹Ý Á¤º¸


1.1. C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ´Â ¾î¶»°Ô °ü¸® µÇ³ª¿ä?

C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ´Â ¿©·¯ ÀÚ¿øºÀ»çÀڵ鿡 ÀÇÇØ À¯Áö º¸¼öµÇ¾î Áý´Ï´Ù. µû¶ó¼­ Ưº°ÇÑ °ü¸®ÀÚ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ FAQ´Â KLDP WIKI¿¡¼­ °ü¸®µÇ¾î Áö¸ç ºÒƯÁ¤ÇÑ ½Ã±â¿¡ Çѹø¾¿ ¹öÀüÀ» ³»³õµµ·Ï ÇÏ°Ú½À´Ï´Ù. ÃֽŠ¹öÀüÀº http://wiki.kldp.org/wiki.php/CSocketFAQ¿¡¼­ È®ÀÎÇϽǼö ÀÖ½À´Ï´Ù.

1.2. º» FAQ´Â ´©±¸¸¦ À§ÇÑ °ÍÀԴϱî?

¸ÕÀú C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ´Â Á¦¸ñ¿¡¼­ º¼¼öÀÖµíÀÌ C¾ð¾î »ç¿ëÀÚ¸¦ À§Çؼ­ Á¦À۵Ǿú½À´Ï´Ù. µû¶ó¼­ ÀÚ¹Ù/WINDOWS ÇÁ·Î±×·¡¸ÓºÐµé²²¼­´Â ´Ù¸¥ FAQ¸¦ ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù. ¶ÇÇÑ º» FAQ´Â C¾ð¾î¸¦ óÀ½ ¹è¿î °³¹ßÀÚ, Á»´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾ò±â ¿øÇÏ´Â »ç¿ëÀÚ È¤Àº Ã¥À» ÀÐ¾î º¸¾ÒÀ¸³ª (´©±¸ Ã¥ ¾îµð ã¾Æ º¸½Ã¸é µË´Ï´Ù ÇÏ´Â ´ë´äÀº ÀÌÁ¦ µè±â ½ÈÀº »ç¿ëÀÚ) Àß ÀÌÇظ¦ ÇÏÁö ¸øÇÏ´Â ´ëºÎºÐÀÇ »ç¿ëÀÚ¸¦ ´ë»óÀ¸·Î ÇÏ°í ÀÖ½À´Ï´Ù.

1.3. º» FAQ¸¦ ÀÌ¿ëÇÏ´Â ÀúÀÛ±ÇÀº ¾î¶»°Ô µË´Ï±î?

¾î´À ´©±¸µµ ¾î¶°ÇÑ ¸ñÀûÀ¸·Îµµ »ç¿ëÀÌ °¡´ÉÇÕ´Ï´Ù. Áï, ¾î´À ´©±¸³ª ¼öÁ¤, ÃâÆÇ¹× Àç ¹èÆ÷µî ¾î¶°ÇÑ ¿ëµµ·Îµµ »ç¿ëÀÌ °¡´ÉÇÕ´Ï´Ù.

2. TCP/IP Åë½Å

2.1. TCP/IP Åë½ÅÀÇ °¡Àå Ä¿´Ù¶õ Ư¡Àº ¹«¾ùÀԴϱî.

ÇÁ·Î±×·¡¸Ó·Î¼­ TCP/IPÀÇ ¿©·¯ Ãø¸éÀ» ¾Ë¾Æ º¸´Â°ÍÀº ÁÁÀ¸³ª °¡Àå Áß¿äÇÑ ¸î°¡Áö°¡ Ư¼ºÀÌ ÀÖ½À´Ï´Ù. ±×°ÍÀº

  • TCP/IP µ¥ÀÌÅÍÀÇ Àü´ÞÀ» º¸ÀåÇÕ´Ï´Ù.
  • ¾ðÁ¦ Àü´ÞµÉÁö´Â º¸ÀåµÇÁö ¾Ê½À´Ï´Ù.

ÀÌ µÎ°¡Áö°¡ °¡Àå Ä¿´Ù¶õ Ư¡ÁßÀÇ Çϳª°¡ ¾Æ´Ò±î »ý°¢µË´Ï´Ù. µû¶ó¼­ ÀÌ¿¡ µû¶ó ÀûÀýÈ÷ ÇÁ·Î±×·¡¹ÖÀ» ÇØÁÖ¾î¾ß¸¸ ÇÒ°ÍÀÔ´Ï´Ù.

2.2. TCP/IP ÇÁ·Î±×·¡¹Ö Ãʺ¸ÀÚÀÔ´Ï´Ù. Ã¥À̳ª »çÀÌÆ® Ãßõ ºÎŹµå¸³´Ï´Ù.

TCP/IP ÇÁ·Î±×·¡¹ÖÀ» óÀ½ ½ÃÀÛÇÏ½Å´Ù¸é ¼­Á¡¿¡¼­ ¾î¶°ÇÑ UNIX TCP/IP ÇÁ·Î±×·¡¹Ö ¼­ÀûÀ» ±¸ÀÔÇϼŵµ ÈǸ¢ ÇÏ´Ù°í º¸ÁõÇÒ¼ö ÀÖ½À´Ï´Ù. ¸ðµç ¼­ÀûÀÌ Àß ±âȹµÇ°í, ¸¸µé¾îÁ³½À´Ï´Ù. ±×·¡¼­ Çϳª¸¦ ÃßõÇØ´Þ¶ó°í ºÎŹÇϸé Richard Stevens¾¾ÀÇ Ã¥À» ±ÇÇÕ´Ï´Ù. ´Ù¸¸ Çѱ۷Π¹ø¿ªµÈ ¾î¶°ÇÑ Richard StevensÀÇ Ã¥µµ ±¸ÀÔÇÏÁö ¸¶½Ã±â ¹Ù¶ø´Ï´Ù. ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ÄÄÇ»ÅÍ ¿ë¾îµéÀ» ¹«¸®ÇÏ°Ô ÇѱÛÈ­ÇÏ´Â ¹Ù¶÷¿¡ Àдµ¥ [http]±èÄ¡ÇÏ¿ë¾î»çÀü(ÇöÀç ¼­ºñ½º Á¦°øÁßÁö)À̶ó´Â ¹®¼­ÀÇ µµ¿ò¾øÀÌ´Â ´Ü ÇÑÁÙµµ ÀÐÀ»¼ö ¾øÀ»°Ì´Ï´Ù. ÇѶ§ ¿ë¾î »çÀüÀÌ ÀÎÅͳݿ¡ Á¸ÀçÇߴµ¥ Áö±ÝÀº ¼­ºñ½ºµÇÁö ¾Ê½À´Ï´Ù.


Ã¥ :
  • UNIX Network Programming by W. Richard Stevens
  • TCP/IP Illustrated by W. Richard Stevens


À¥»çÀÌÆ® :

3. C/S ÇÁ·Î±×·¡¹Ö

3.1. SUN Solaris¿¡¼­ ÄÄÆÄÀÏÀº Á¦´ë·Î µÇ³ª ¸µÅ©½Ã ¿¡·¯°¡ ³³´Ï´Ù.

Linux¿¡¼­´Â ±âº»ÀûÀ¸·Î ¸µÅ©ÇؾßÇÒ ¼ÒÄ϶óÀ̺귯¸®°¡ ±âº»ÀûÀ¸·Î ÀÖ´Â ¹Ý¸é¿¡ SUN Solaris¿¡¼­´Â º°µµ·Î ¸µÅ©¸¦ ÇØÁÖ¾î¾ß¸¸ ÇÕ´Ï´Ù. ´ÙÀ½°ú °°Àº ¿É¼ÇÀ» ÁÖ¾î ¶óÀ̺귯¸®¸¦ ¸µÅ©ÇØÁֽñ⠹ٶø´Ï´Ù.

 -lsocket -lnsl

3.1.1. ¼ÒÄÏÀÇ Á¢¼ÓÇØÁ¦´Â ¾î¶»°Ô ¾Ë¼ö°¡ ÀÖ½À´Ï±î.?

´ëºÎºÐÀÇ °æ¿ì recv()¿¡¼­ ¹Ýȯ°ªÀÌ 0ÀÎ °æ¿ì¿¡´Â »ó´ëÆí¿¡¼­ Á¢¼ÓÀ» ÇØÁ¦ÇÑ°ÍÀ¸·Î ÆÇ´ÜÇÏ½Ã¸é µË´Ï´Ù.

recv()°¡ ¹ÝȯÇÏ´Â °ªÀº

  • recv() = 0 »ó´ëÆíÀÇ Á¢¼Ó ÇØÁ¦
  • recv() > 0 recv()°¡ ÀÐ¾î µéÀÎ ¹ÙÀÌÆ®
  • recv() = -1 ¿¡·¯

ÀÔ´Ï´Ù.

3.2. ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍ°¡ ´Ù¸£°Ô ³ªÅ¸³³´Ï´Ù.

µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍ°¡ ´Ù¸£°Ô ³ªÅ¸³ª´Â ÀÌÀ¯´Â ¿©·¯°¡Áö·Î ÃßÃøÇغ¼¼ö Àִµ¥

  • ¹ÙÀÌÆ® Æеù ¿À·ù(x86¹× ±âŸ ´Ù¸¥ Ç÷¿Æû)
  • ¹ÙÀÌÆ® ¿À´õ Â÷ÀÌ(x86¹× ±âŸ ´Ù¸¥ Ç÷¿Æû)
  • µ¥ÀÌÅÍ ¼Û/¼ö½Å ±¸ºÐ

ÀÌ°÷¿¡¼­ ´Ù·ê ºÎºÐÀº ¼¼¹ø°ÀÔ´Ï´Ù. Áï, µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍÀÇ Å©±â Á¤º¸¸¦ º¸³»Áö ¾Ê¾Æ¼­ »ý±â´Â ¿À·ù°¡ ¿Õ¿Õ»ý±é´Ï´Ù. µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã¿¡´Â ¹Ýµå½Ã µ¥ÀÌÅÍÀÇ Å©±â Á¤º¸°¡ »ó´ëÃø¿¡ Àü´ÞÀÌ µÇ°Å³ª »ó´ëÃø¿¡¼­ ¹Ì¸® ¾Ë°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀº TCP/IP Åë½ÅÀÇ Æ¯¼ºÁß Çϳª·Î µ¥ÀÌÅÍÀÇ Àü´ÞÀº º¸ÁõÀÌ µÇÁö¸¸ ¾ðÁ¦ Àü´ÞµÉÁö¿¡ ´ëÇÑ º¸ÁõÀÌ ¾ø½À´Ï´Ù. ´ëºÎºÐÀÇ ¿¡Çø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥¿¡¼­´Â µ¥ÀÌÅÍ°¡ ¼ö½ÅµÇ¸é Áï½Ã ¾î¶°ÇÑ ÀÛ¾÷À» Çϵµ·Ï ÇÏ°Ô µÇ´Âµ¥ Àü¼ÛµÈ µ¥ÀÌÅÍ°¡ ¸ðµÎ Àü´ÞÀÌ µÇÁö ¾ÊÀº »óÅ¿¡¼­ ´Ù¸¥ ÀÛ¾÷À» ÇÏ°Ô µÉ °æ¿ì¿¡ À߸ø Àü´ÞµÈ°ÍÀ¸·Î Âø°¢ÇÏ°Ô µÇ´Â °æ¿ìÀÔ´Ï´Ù.

ÀÌ°æ¿ì ¶Ç ÇÑ°¡Áö ÃßÃøÇغ¼¼ö Àִ°ÍÀº Àü¼ÛÇÏ´Â Ãø¿¡¼­ 1,000 ¹ÙÀÌÆ®¸¦ Àü¼ÛÇß´Ù°í »ý°¢ÇßÁö¸¸ send()ÀÇ ¸®ÅÏ°ªÀ» ÇÁ¸°Æ® Çغ¸¸é 512 ¹ÙÀÌÆ®¸¸ Ãâ·ÂµÇ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ³ª¸ÓÁö Á¤º¸´Â ¼Û½Å ¹öÆÛ¿¡¼­ ´ë±â¿­¿¡ Á¸ÀçÇϴ°ÍÀÔ´Ï´Ù. µû¶ó¼­ ¿øÇÏ´Â µ¥ÀÌÅ͸¦ Çѹø¿¡ ¸ðµÎ Àü¼ÛÇϱ⸦ ¿øÇÒ°æ¿ì¿¡´Â
int sendall(int s, char *buf, int *len)
{
  int total = 0;        // how many bytes we've sent
  int bytesleft = *len; // how many we have left to send
  int n;

    while(total < *len) {
        n = send(s, buf+total, bytesleft, 0);
        if (n == -1) { break; }
        total += n;
        bytesleft -= n;
    }

    *len = total; // return number actually sent here

    return n==-1?-1:0; // return -1 on failure, 0 on success
}

¿Í °°Àº Äڵ带 ÀÌ¿ëÇϽǼö ÀÖ½À´Ï´Ù(µ¥ÀÌÅÍ ¼Û½Å½Ã À§ÀÇ ÄÚµå´Â ¾ÆÁÖ ÀϹÝÀûÀ¸·Î ³Î¸® »ç¿ëµÇ´Â ÄÚµåÀÔ´Ï´Ù) Áï, µ¥ÀÌÅÍ ¼Û½Å½Ã ¿À·ù°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é ¿øÇÏ´Â µ¥ÀÌÅÍ Å©±â¸¸Å­ Àü¼ÛÀÌ µÇ¾î¾ß¸¸ ·çÇÁ¸¦ ºüÁ®³ª¿À°Ô ¸¸µç°ÍÀÔ´Ï´Ù.

¶ÇÇÑ ÀϹÝÀûÀÎ TCP/IP Åë½Å¿¡¼­´Â ÇÁ·ÎÅäÄÝ ¼³°è¸¦ ÇÒ¶§ µ¥ÀÌÅÍÀÇ Å©±â Á¤º¸(µ¥ÀÌÅÍÀÇ Å©±â°¡ ÀϹÝÀûÀ¸·Î °¡º¯ÀûÀÎ °æ¿ì)¸¦ Àü´ÞÇϱâ À§ÇØ µ¥ÀÌÅ͸¦ Çì´õ+¹Ùµð ºÎºÐÀ¸·Î ±¸ºÐÇؼ­ Àü´ÞÀ» Çϸç ÀÌÁß Çì´õ ºÎºÐÀÇ Å©±â´Â ÀÏÁ¤ÇÏ°Ô °íÁ¤µÇ¾î ÀÖ´Â °æ¿ì°¡ º¸ÅëÀÌ¸ç ¹Ùµð ºÎºÐÀÇ Å©±â´Â Çì´õºÎºÐÀÇ Æ¯Á¤ÇÑ À§Ä¡¿¡ ½Ç¾î¼­ º¸³»´Â°ÍÀÌ ÀϹÝÀûÀÔ´Ï´Ù. µû¶ó¼­ Àü´ÞÃø¿¡¼­´Â º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ ¹Ùµð ºÎºÐÀÇ Å©±â¸¦ ¾Ë¾Æ³½ÈÄ¿¡ µ¥ÀÌÅÍ Çì´õºÎºÐ¿¡ ±× ¹ÙµðÀÇ Å©±â¸¦ ½Ç¾î¼­ º¸³»¸é ¼ö½ÅÃø¿¡¼­ ÀÏÁ¤ÇÑ Å©±â·Î ÁöÁ¤µÇ¾î ÀÖ´Â Çì´õºÎºÐÀ» ¼ö½ÅÇÑÈÄ¿¡ ±×°÷¿¡¼­ ¹Ùµð ºÎºÐÀÇ Å©±â¸¦ ÀÐ¾î µéÀÎ ´ÙÀ½¿¡ ±× Å©±â ¸¸Å­ ¹Ùµð ºÎºÐÀ» ¼ö½ÅÇÏ´Â ¹æ¹ýÀ» äÅÃÇÏ½Ã¸é µË´Ï´Ù.

¾Æ·¡ÀÇ ¿¹Á¦´Â µ¥ÀÌÅÍ Àü¼ÛÀ» Çì´õ+¹Ùµð ºÎºÐÀ¸·Î ±¸ºÐÇÙ¼­ Àü¼ÛÇÏ´Â ¿¹¸¦ µé¾î º¸ÀΰÍÀ¸·Î ¼Û/¼ö½Å Ãø¿¡¼­´Â Çì´õ ºÎºÐÀÇ Å©±â´Â Ç×»ó 4 ¹ÙÀÌÆ®¶ó°í ±ÔÁ¤À» Áö¾î ³õ¾Æ¼­ ¼ö½ÅÃø¿¡¼­´Â ¿ì¼± 4¹ÙÀÌÆ®¸¸ ¼ö½ÅÀ» Çغ¸°í µ¥ÀÌÅÍ ºÎºÐÀ» ÆĽÌÇغ¸°í ¹ÙµðÀÇ Å©±â°¡ 02 ¹ÙÀÌÆ®¶ó´Â°ÍÀ» ¾Ë°í ÀçÂ÷ 3¹ÙÀÌÆ® ¸¸Å­ ¼ö½ÅÀ» Çؼ­ ³ª¸ÓÁö ¹Ùµð ºÎºÐÀ» ¼ö½ÅÇؼ­ ¿Ï·áÇÏ´Â ±×¸²ÀÔ´Ï´Ù. (Âü°í, SOH EOT ºÎºÐÀº ¹«½ÃÇصµ ÁÁ½À´Ï´Ù)
       Çì    ´õ                         ¹Ù    µð
 µ¥ÀÌÅÍ ±¸ºÐ+¹Ùµð »çÀÌÁî+ SOH     °¡º¯ÀûÀÎ µ¥ÀÌÅÍ + EOT

    SENDER           RECEIVER

  1.  A03FH      ---> A03
  2.                    Header Area Parse
  3.               ---> FH

Âü°í : ¾Æ·¡ÀÇ °³³äµµ´Â 'A','B','C','D'¸¦ 4¹ø Àü¼ÛÇÑ´Ù°í Çصµ ¼ö½ÅÃø¿¡¼­ 4¹ÙÀÌÆ® ¼ö½ÅÀ» Çعö¸®¸é ¼ö½ÅÃø¿¡¼­´Â ¼Û½ÅÃøÀÌ 4¹ø¿¡ ³ª´©¾î Àü¼ÛÇß´Ù°í Çصµ Çѹø¿¡ ¼Û½Å ÇÑ°ÍÀ¸·Î ÆÇ´ÜÀÌ µË´Ï´Ù. Áï, µÎ°¡Áö ¸ð¾çÀÌ ¸ðµÎ °°Àº°ÍÀ¸·Î ÆÇ´ÜÇÏ½Ã¸é µË´Ï´Ù.
    SENDER           RECEIVER

  1.  A      --->
  2.  B      --->
  3.  C      --->
  4.  D      --->      ABCD

  ---------------------------------------------

    SENDER           RECEIVER

  1.  ABCD   --->      ABCD

3.3. ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é Á¢¼ÓÀÌ ÀÚµ¿À¸·Î ²÷±é´Ï´Ù.

¼­¹ö ȤÀº Ŭ¶óÀ̾ðÆ® Ãø¿¡¼­ Ưº°ÇÑ Á¶Ä¡¸¦ ÃëÇѰ͵µ ¾Æ´Ñµ¥ ÀÏÁ¤ÇÑ ½Ã°£ÀÌ Áö³ª¸é Á¢¼ÓÀÌ ²÷±â´Â°ÍÀº »ç³»ÀÇ ¹æÈ­º®À» ÀǽÉÇغ¼ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ »ç³» ¹æÈ­º®µéÀÌ HTTP ÇÁ·ÎÅäÄݸ¸ Çã¿ëÇϵµ·Ï ¼³Á¤ÀÌ µÈ °æ¿ì°¡ ¸¹Àºµ¥ HTTPÀÇ °æ¿ì Àå½Ã°£ Á¢¼ÓÀ» À¯ÁöÇÒ ÇÊ¿ä°¡ ¾ø±â ¶§¹®¿¡ ÀÏÁ¤ÇÑ ½Ã°£ Á¢¼ÓÀÌ Áö¼ÓµÇ¸é ÀÚµ¿À¸·Î Á¢¼ÓÀ» ²÷¾î ¹ö¸®µµ·Ï µÇ¾î ÀÖ½À´Ï´Ù.

±×·¯³ª C/S°¡ »ç¿ëÀÚÀÇ ÀÎÁõ¹× º¸¾È½Ã½ºÅÛÀÌ Å¾ÀçµÇ¾î ÀÖ´Ù¸é Çѹø Á¢¼ÓÀÌ ²÷±â°Ô µÇ¸é »õ·Ó°Ô Á¢¼ÓÇÏ¿© ÀÎÁõÀ» ÇØ¾ß ÇÏ´Â ºÒÆíÇÑÁ¡ÀÌ »ý±â¹Ç·Î ÀÌ·² °æ¿ì ¼Õ½±°Ô ÇØ°áÇÒ¼ö ÀÖ´Â ¹æ¹ýÀº C/S°£¿¡ ÀÏÁ¤ ½Ã°£(Á¢¼ÓÀ» ²÷¾î¹ö¸®´Â ½Ã°£) À̳»¿¡ CHIT-CHAT(ȤÀº ) ¸Þ½ÃÁö¸¦ º¸³»µµ·Ï ¸¸µé¾î ³õ´Â °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀº Ŭ·¯½ºÅ͸µ ½Ã½ºÅÛ¿¡µµ À¯¿ëÇÏ°Ô »ç¿ëµÇ´Â°ÍÀ¸·Î ½Ã½ºÅÛÀÌ ¼­·Î°£ÀÇ Á¤»ó À¯ÁöÁßÀÎÁö¸¦ ÆÇ´ÜÇϴµ¥µµ ÀÌ¿ëµÉ¼ö ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­´Â Àǹ̾ø´Â ¹®ÀÚ¸¦ ÁÖ°í ¹Þ´Â °æ¿ìµµ ÀÖÁö¸¸ ÀÏ·Ã ¹øÈ£¸¦ ¼­·Î Àü¼ÛÇÏ´Â ¹æ¹ýµµ »ç¿ëµÇ¾î Áý´Ï´Ù.

´Ù¸¸ ÀÌ·¯ÇÑ ½Ã½ºÅÛÀÇ ´ÜÁ¡Àº ¼­¹öÃø¿¡¼­ Ŭ¶óÀ̾ðÆ®°¡ ÀÏÁ¤ ½Ã°£ »ç¿ëÀÌ ¾øÀ¸¸é ²÷¾î¹ö¸®°Ô ¸¸µå´Â(°¡¿ë ÀÚ¿øÀÇ È®º¸ Ãø¸é) ¹æ¹ýÀ» ´Ù¸¥ÂÊ¿¡¼­ ±¸ÇöÇØ ³õ¾Æ¾ß ÇѴٴ°ÍÀÔ´Ï´Ù. ´ëºÎºÐÀÇ ºñÁî´Ï½º C/S¿¡¼­´Â Ŭ¶óÀ̾ðÆ®Ãø »ç¿ëÀÚµéÀÇ »ç¿ë ÆÐÅÏÀÌ Çѹø ¼­¹ö¿¡ Á¢¼ÓÇسõ°í ¸çÄ¥ÀÌ°í »ç¿ëÇÏ´Â °æ¿ì°¡ ¸¹´Ù´Â Á¡¿¡ Âø¾ÈÀ» ÇØ¾ß ÇϹǷΠ¼­¹öÀÇ °¡¿ë ÀÚ¿ø È®º¸¶ó´Â Ãø¸é¿¡¼­ Á¢±ÙÀ» ÇØ¾ß ÇÕ´Ï´Ù.

3.4. bind() È£Ãâ½Ã "address already in use" ¿¡·¯°¡ ¹ß»ýÇÑ ÇÕ´Ï´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡´Â ¼­¹ö¸¦ ÁߴܽÃŲÈÄ¿¡ ¹Ù·Î Àç½ÃÀÛÀ» ÇßÀ»¶§ ±âÁ¸ÀÇ ÇÁ·Î±×·¥ ¼ÒÄÏÀÌ ¾ÆÁ÷µµ Á¡À¯ÇÏ°í »ç¿ëÇϱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â ¿¡·¯¸Þ½ÃÁöÀÔ´Ï´Ù.

netstat -a ±×¸²


ÀÌ°ÍÀº ¼­µÎ¿¡ ¿ì¸®°¡ Á¤ÀÇ ÇßµíÀÌ TCP/IPÀÇ Æ¯¼º ¶§¹®¿¡ ¹ß»ýÇÏ´Â °ÍÀÔ´Ï´Ù. Áï, TCP/IP µ¥ÀÌÅÍ°¡ ¹Ýµå½Ã Àü¼ÛµÈ´Ù´Â°ÍÀº º¸ÀåÇÏÁö¸¸ ¾ðÁ¦ Àü¼ÛÀÌ µÇ´ÂÁö º¸ÀåÇÏÁö ¸øÇϴ°ÍÀÔ´Ï´Ù. À̺κÐÀ» º¸¸é µÎ°³ÀÇ ÇÁ·Î±×·¥ÀÌ ¼­·Î TCP/IP Åë½ÅÀ» ÇÏ°í ÀÖ´Ù°¡ ÇÑÂÊÀÌ Áß´ÜÀ» ÇÏ°Ô µÇ¸é ¼­¹öÂÊ¿¡¼­´Â TIME_WAIT »óÅ·Πµé¾î °¡°Ô µË´Ï´Ù. ÀÌ°ÍÀº Á¤¸» ¸ðµç µ¥ÀÌÅ͵éÀÌ ´Ù Àü¼ÛÀÌ µÇ°í ¼ö½ÅÀÌ µÇ´ÂÁö È®ÀÎÇϱâ À§ÇÑ ÀýÂ÷ÀÔ´Ï´Ù. RFC 793 ¹®¼­¸¦ º¸°Ô µÇ¸é


Á¢¼Ó ÇØÁ¦½Ã

      TCP A                                                TCP B

  1.  ESTABLISHED                                          ESTABLISHED

  2.  (Close)
      FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT

  3.  FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT

  4.                                                       (Close)
      TIME-WAIT   <-- <SEQ=300><ACK=101><CTL=FIN,ACK>  <-- LAST-ACK

  5.  TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED

  6.  (2 MSL)
      CLOSED

                         Normal Close Sequence
                               Figure 13.

¿Í °°Àº ÀýÂ÷¸¦ °ÅÄ¡°Ô µË´Ï´Ù. À̺κÐÀº TCP/IPÀÇ Á¢¼Ó, Á¢¼ÓÇØÁ¦¿¡ °üÇÑ Á¶±Ý´õ º¹ÀâÇÑ ÀýÂ÷°¡ Á¸ÀçÇϹǷΠÂ÷ÈÄ¿¡ ´Ù½Ã ¼³¸í µå¸®µµ·Ï ÇÏ°Ú½À´Ï´Ù. ³»¿ëÀÌ Á¶±Ý ±é´Ï´Ù


¼­¹öÃø¿¡¼­ ÀÌ¿Í °°Àº ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â °£´ÜÈ÷ setsockopt() ÇÔ¼ö¿¡¼­ 4¹ø° ÀÎÀÚ¸¦ SO_REUSEADDR °ªÀ» ÁÜÀ¸·Î¼­ ÇØ°áÇϽǼö ÀÖ½À´Ï´Ù.
 int setsockopt(int s , int level , int optname, const void * optval , socklen_t optlen);

3.5. Á¦ ¼­¹ö¸¦ µ¥¸ó ¸ðµå·Î µ¿ÀÛ½ÃÅ°°í ½Í½À´Ï´Ù.

¼­¹ö¸¦ µ¥¸óÀ¸·Î µ¿ÀÛ½ÃÅ°´Â ¹æ¹ýÀº ÀÚ½ÅÀÇ ÇÁ·Î¼¼¼­°¡ ½Ã½ºÅÛ»ó¿¡¼­ ÀÚ½Ä(CHILD) ÇÁ·Î¼¼¼­°¡ µÇ¾î¾ß ÇÏ°í ÀÚ½ÅÀÇ ¸ð(PARENT)ÇÁ·Î¼¼¼­´Â 1¹ø Áï, init ÇÁ·Î¼¼¼­°¡ µÇ°Ô ¸¸µé¸é µË´Ï´Ù. À̶§ ½Ã±×³ÎÀ» ÀÌ¿ëÇÏ¿© ¿©·¯°¡Áö Æ÷¾î±×¶ó¿îµå»ó¿¡¼­ µ¿À۵Ǵ ½Ã±×³ÎµéÀ» µ¿ÀÛÇÏÁö ¾Ê°Ô Çϴ°ÍÀÌ ÁÁ½À´Ï´Ù.

¸¸¾à ÀÌ ¼­¹ö°¡ ÇÁ·Î¼¼¼­(fork) ¹æ½ÄÀÇ ¼­¹ö¶ó¸é ÇâÈÄ »ý¼ºµÇ´Â ÀÚ½Ä ÇÁ·Î¼¼¼­ÀÇ ¹øÈ£´Â ÃÖÃÊ ¼­¹ö ±¸¼º½Ã ÇÒ´ç¹ÞÀº(ÇÏÁö¸¸ ÀÌ°ÍÀº µ¥¸ó ¸ðµå·Î µ¿À۵Ǹ鼭 »ç¶óÁü) ÇÁ·Î¼¼¼­ ¹øÈ£ ´ÙÀ½ºÎÅÍ »ý¼ºÀÌ µÉ°ÍÀÔ´Ï´Ù.
int init_daemon()
{
  pid_t pid;

    if ((pid = fork()) < 0) {
        exit(0);
    } else if (pid !=0) {
        exit(0);
    }

    setsid(); /* ÇÁ·Î¼¼¼­¸¦ ¼¼¼Ç ¸®´õ·Î ¼³Á¤ */

}

3.6. ¸®¸ðÆ® ½Ã½ºÅÛÀÇ MAC ÁÖ¼Ò¸¦ ¾Ë°í ½Í½À´Ï´Ù.

¸®¸ðÆ® ½Ã½ºÅÛÀÇ MAC ÁÖ¼Ò¸¦ ¾Ë¾Æ³»´Â°ÍÀº IPÁÖ¼Ò¸¦ ÀÌ¿ëÇؼ­ °¡´ÉÇÏÁö¸¸ ¾ÆÁÖ ÀϹÝÀûÀÎ »óȲ¾Æ ¾Æ´Ï¸é ±×°ÍÀÌ º°¹Ý Àǹ̰¡ ¾ø´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. ±×°ÍÀº ¿äÁîÀ½ ±â¾÷ÀÇ ÀÎÅÍ³Ý »óȲÀÌ ´ëºÎºÐ ¹æÈ­º®À» Åë°úÇÏ°Ô²û ¼³°è°¡ µÇ¾î Àֱ⠶§¹®¿¡ ±×·¸½À´Ï´Ù.

int ClientMacAddress(char *ip, char *macaddress)
{
  struct sockaddr_in sin = { 0 };
  struct arpreq myarp = { { 0 } };
  int sockfd;
  unsigned char *ptr;

    sin.sin_family = AF_INET;
    if (inet_aton (ip, &sin.sin_addr) == 0) {
        printf ("'%s' address is not valid\n",ip );
        return -1;
    }

    memcpy (&myarp.arp_pa, &sin, sizeof myarp.arp_pa);
    strcpy (myarp.arp_dev, "eth0");

    if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
        printf ("cannot open socket\n");
        return -2;
    }

    if (ioctl (sockfd, SIOCGARP, &myarp) == -1) {
        /* ·ÎÄÃÀÏ °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ */
        printf(" no entry in arp_cache for '%s'\n",ip);
        return -3;
    }

    ptr = &myarp.arp_ha.sa_data [0];

    snprintf(macaddress, 50, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
            *ptr, *(ptr+1),*(ptr+2), *(ptr+3),*(ptr+4),*(ptr+5));

    return 0;

}

3.7. ƯÁ¤ ¼­¹ö¿¡ Á¢¼Ó½Ã "connection refused"¶ó´Â ¿¡·¯ ¸Þ½ÃÁö°¡ ³ª¿É´Ï´Ù.

ÇöÀç Á¢¼ÓÇÏ°íÀÚ ÇÏ´Â ¼­¹öÀÇ ÁÖ¼Ò/Æ÷Æ®¸¦ Á¤È®È÷ È®ÀÎÇϽñ⠹ٶø´Ï´Ù. ¸¸¾à Á¤È®ÇÏ´Ù¸é ±× ¼­¹ö¿¡ ¿øÇÏ´Â Æ÷Æ®°¡ ¸®½º´×(listening)ÁßÀÎÁö È®ÀÎÇϼž߸¸ ÇÕ´Ï´Ù. ±×°ÍÀº netatat -a ¸í·É¾î·Î È®ÀÎÀÌ °¡´ÉÇϸç(¿¹Á¦ È­¸é) Á¤È®È÷ µ¿ÀÛÁßÀ̶ó°í ÇÏ¸é ¹æÈ­º®À» ÀǽÉÇغ¸½Ã±â ¹Ù¶ø´Ï´Ù. ¶ÇÇÑ ÀǽÉÇÒ¸¸ÇÑ ºÎºÐÀº Á¢¼ÓÇÏ°íÀÚ ÇÏ´Â ¼­¹ö¿¡¼­ °úµµÇÑ Á¢¼ÓÀÌ µé¾î¿Í Á¢¼ÓÀÌ °ÅºÎµÇ´Â »óȲÀÔ´Ï´Ù.


3.8. °³º° »ç¿ëÀÚ(Á¢¼Ó)¿¡ ´ëÇÑ °ü¸®¿¡ ´ëÇÑ °³³äµµ´Â ¾î¶»°Ô ±×¸®½Ã³ª¿ä.?

ÀÌ°ÍÀº ÇÁ·Î±×·¥ °³¹ßÀÚµéÀÇ ÃëÇâ¿¡ µû¶ó ´Ù¸¦¼ö°¡ ÀÖ½À´Ï´Ù¸¸ º¸ÅëÀÇ °æ¿ì´Â °³º° Á¢¼ÓÀ» °³º° »ç¿ëÀÚ·Î ÀνÄÇÏ¿© ÇϳªÀÇ Á¢¼ÓÀÌ µé¾î ¿Ã¶§ ±× Á¢¼Ó¿¡ ´ëÇÑ ±¸Á¶Ã¼¸¦ »ý¼ºÇÏ°Ô µË´Ï´Ù. ±× ±¸Á¶Ã¼ ¾È¿¡´Â ¸®¸ðÆ®IP, ½Ã°£, FDµîµîÀ» ±â·ÏÇØ µÎ¾ú´Ù°¡ ÇÊ¿ä½Ã È°¿ëÇÏ°Ô µË´Ï´Ù. À̶§ °³º° Á¢¼Ó¿¡ ´ëÇÑ °¡Àå Áß¿äÇÑ Å°°¡ µÇ´Â °ªÀ» FDÀÔ´Ï´Ù.

3.9. ¼­¹ö ÇÁ·Î±×·¥ Á¦ÀÛ¿¡ ´ëÇÑ »ç·Ê¸¦ µé¾î ÁÖ¼¼¿ä.

¼­¹ö ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀº ¾÷¹« ³»¿ë°ú °¢ ¿¡Çø®ÄÉÀ̼ÇÀÇ Æ¯¼º¿¡ µû¶ó ´Ù¾çÇÏ°Ô Á¦ÀÛÀÌ °¡´ÉÇÕ´Ï´Ù. ÀÌÁß Áõ±Ç ¼­¹ö¸¦ ±âÁØÀ¸·Î ¸î°¡Áö¸¸ ¿¹·Î µé¾î º¸°Ú½À´Ï´Ù. Áõ±Ç ¼­¹ö´Â Å©°Ô ÁÖ¹®/Á¤º¸ ¼­¹ö·Î ±¸ºÐÀÌ µÇ´Âµ¥ ÀÌÁß Á¤º¸ ¼­¹ö°¡ °¡Àå Ä¿´Ù¶õ ºÎºÐÀ» ´ã´çÇÏ°í ÀÖ½À´Ï´Ù. Á¤º¸ ¼­¹ö´Â Áõ±Ç°Å·¡¼Ò¿¡¼­ Àü¼ÛµÇ´Â °¡°ÝÁ¤º¸¸¦ ¼ö½ÅÇÏ´Â UDP¼­¹ö¸¦ ±âº»À¸·Î ÀÌ Á¤º¸¸¦ ÀúÀåÇϰųª °¡°øÇÏ´Â ¼­¹öµé·Î ±¸¼ºÀÌ µË´Ï´Ù. ´ëÃæ ±× ±¸¼ºÀ» º¸¸é ´º½º/íƮ/È£°¡/¸Þ¸ð¸®Ç®/DB/ÁÖ¹® ¼­¹öµé·Î ±¸¼ºÀÌ µÇ¾î ÀÖ½À´Ï´Ù.

Áõ±Ç»ç ÇÁ·Î±×·¥ÀÇ Æ¯¼º»ó Ç¥½ÃÇÏ°í ¿äûÇØ¾ß ÇÏ´Â µ¥ÀÌÅÍ°¡ ¸¹Àº °ü°è·Î Ŭ¶óÀ̾ðÆ®´Â Åë½ÅÂÊ µ¥ÀÌÅ͸¸ °ü¸®ÇÏ´Â Åë½Å Çڵ鷯¸¦ º°µµ·Î µÎ°í ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº °¢ °³º° À©µµ¿ì¿¡¼­ ¿äûÇÏ´Â µ¥ÀÌÅÍÀÇ Á¾·ù¸¦ ÆľÇÇÏ¿© ¼­¹öÃø¿¡ ±×¿¡ ÇØ´çÇÏ´Â ÀڷḦ ¿äûÇÏ°í ¼ö½ÅÇÏ¿© °³º° À©µµ¿ì¿¡ Àü´ÞÇØÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. µû¶ó¼­ C/S ȯ°æÀº Subscribe/Publish ¹æ½ÄÀÌ Ã¤Åõǰí ÀÖ½À´Ï´Ù.


  • DB ¼­¹ö´Â °³º° ¼­¹öµé¿¡¼­ Á÷Á¢ ¿¢¼¼½º ÇÏÁö ¾Ê°í DB¼­¹ö¿¡ º°µµÀÇ µ¥¸óÀ» ±¸µ¿ÇÏ¿© ÀÌ µ¥¸óÀ» ÅëÇÏ¿© SELECT/INSERT/UPDATE¸¦ ¼öÇàÇÏ°Ô ÇÕ´Ï´Ù. ¶ÇÇÑ ºó¹øÇÑ Àڷᳪ ½Å¼Ó¼ºÀ» ¿äÇÏ´Â Á¤º¸ÀÇ °æ¿ì¿¡´Â »õ·Î¿î À̺¥Æ® ¹ß»ý½Ã DB Äõ¸®¸¦ ÅëÇÏÁö ¾Ê°í ´Ã ¸Þ¸ð¸®¿¡ ÀúÀåÇÏ°í ÀÖ´Ù°¡ ÀÀ´äÀ» ÇÏ°Ô µË´Ï´Ù.


  • ´º½º ¼­¹ö´Â Àü¼ÛµÇ´Â µ¥ÀÌÅÍÀÇ ¾çÀÌ ¸¹Áö¸¸ Á¤ÀûÀÎ ÀÚ·á°¡ ÁÖ¸¦ ÀÌ·ç¹Ç·Î ½Ç½Ã°£ ºê·Îµå ÄɽºÆÃÀ» ÇÏÁö ¾Ê°í Ŭ¶óÀ̾ðÆ®ÀÇ ¿ä±¸¿¡ µû¶ó ¹ÝÀÀÇÏ°Ô µÇ¾î ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é »ç¿ëÀÚ°¡ ´º½ºÃ¢À» ¶ç¾úÀ»¶§ ±×¿¡ ÇØ´ç ÇÏ´Â ´º½º Á¦¸ñ¸¸ 20°Ç Àü¼ÛÇØÁÖ°í ´º½º ³»¿ëÀ» Ŭ¸¯ÇßÀ»¶§ ±× ´º½ºÀÇ ³»¿ë¿¡ ÇØ´çÇÏ´Â ÀڷḦ Àü¼ÛÇØÁÝ´Ï´Ù. ¶ÇÇÑ ½ºÅ©·Ñ¹Ù¸¦ Ŭ¸¯ÇÏ¿© 20°ÇÀÇ ´º½º Á¦¸ñÀÌ ³Ñ¾î°¡¸é »õ·Î¿î 20°ÇÀ» Àü¼Û¿äûÇÏ°Ô µÇ´Â Çü½ÄÀÔ´Ï´Ù.


  • íƮ ¼­¹ö´Â Á¤/µ¿ÀûÀÎ µ¥ÀÌÅ͸¦ ÇÔ²² ´Ù·ì´Ï´Ù. Áï, °ú°Å ÀڷḦ ºñ±³Çϱâ À§Çؼ­´Â Á¤ÀûÀÎ µ¥ÀÌÅ͸¦ ÇÊ¿ä·Î ÇÏÁö¸¸ ÀåÁßÀÇ °¡°Ý Á¤º¸¸¦ ¿øÇÒ°æ¿ì¿¡´Â ½Ç½Ã°£ µ¥ÀÌÅ͸¦ ¿äûÇÏ¿© ½Ç½Ã°£ íƮ¸¦ »ý¼ºÇÏ°Ô ÇÕ´Ï´Ù.


  • È£°¡¼­¹ö´Â Áõ±ÇÀü»ê¿¡¼­ 10Â÷ È£°¡±îÁö °ø°³°¡ µÇ¹Ç·Î µ¥ÀÌÅÍÀÇ Àü¼ÛÀÌ °¡Àå ºó¹øÇϸ鼭µµ ¸¹½À´Ï´Ù. ¹«¾ùº¸´Ù ½Å¼Ó¼ºÀ» ¿ì¼±À¸·Î Çϸç Áõ±Ç»ç¿¡ µû¶ó UDP ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÏ´Â ¼­¹ö°¡ Á¸ÀçÇÕ´Ï´Ù. ´ëºÎºÐÀÇ Áõ±Ç»ç ¼­¹ö´Â È£°¡ ¼­¹ö·Î ±¸¼ºÀÌ µÇ´Â°ÍÀÌ ÀÌ·¯ÇÑ ÀÌÀ¯ÀÔ´Ï´Ù.


  • ¸Þ¸ð¸®Ç®¼­¹ö´Â ÃÖÃÊ Å¬¶óÀ̾ðÆ® ±¸¼º½Ã ¼ø½Ä°£¿¡ ¸¹Àº ¾çÀÇ µ¥ÀÌÅ͸¦ Ç¥ÇöÇØ¾ß ÇÏ´Â °ü°è·Î °¢ ¼­¹öµé¿¡ ÀÏÀÏÀÌ ¿äûÀ» Çؼ­ Ç¥½ÃÇϱ⿡´Â ±¸µ¿½Ã°£ÀÌ ³Ê¹« ¿À·¡ °É¸®¹Ç·Î ÃÖÃÊ ±¸µ¿¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ ºÎºÐ¸¸ µû·Î °¡Áö°í ÀÖ´Â ¼­¹öÀÔ´Ï´Ù.

±âŸ °ÔÀÓ¼­¹ö/ÀºÇ༭¹öµîµî ´Ù¾çÇÑ Á¾·ùÀÇ ¼­¹öµéÀÌ Á¸ÀçÇϴµ¥ Ưº°ÇÑ ±ÔÄ¢ÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸´Ï °¢ »óȲ¿¡ ¸Â°Ô Á¦ÀÛÇÏ´Â ¹æ¹ýÀ» ã¾Æ³»´Â°ÍÀÌ Áß¿äÇÒ°ÍÀÔ´Ï´Ù.


4. ¼­¹ö ¸ðµ¨(SELECT/POLL/FORK/THREAD)

4.1. select()´Â ¹«¾ùÀΰ¡¿ä.?

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

SELECT()°¡ *nix ½Ã½ºÅÛ¿¡ žÀçµÈ ÀÌ·¡·Î ´Ù¾çÇÑ ºÐ¾ß¿¡ ¾²ÀÌ°í ÀÖ½À´Ï´Ù. °¡Àå ÀÚÁÖ ºó¹øÇÏ°Ô »ç¿ëÇÏ´Â ºÐ¾ß´Â


  • Synchronous I/O Multiplexing
  • File Descriptor Read/Writeable
  • Timeout


µîµîÀÔ´Ï´Ù. select()´Â ½Ã½ºÅÛÀÌ Çã¿ëÇÏ´Â ÃÖ´ë fd(½Ã½ºÅÛ ¸¶´Ù ´Ù¸§)¿¡ ´ëÇØ read/write ºñÆ® °Ë»ç¸¦ ÇÕ´Ï´Ù. Áï, Àбâ/¾²±â °¡´ÉÇÑÁö¿¡ ´ëÇÑ °Ë»ç¸¦ ÇÏ¸ç µ¿½Ã¿¡ ŸÀӾƿô °ª±îÁö °Ë»ç°¡ °¡´ÉÇÕ´Ï´Ù. ÀÌ°ÍÀ» ÀÌ¿ëÇÏ°Ô µÇ¸é µ¿½Ã¿¡ ¿©·¯ ¼ÒÄÏÁ¢¼Ó¿¡ ´ëÇØ Ã³¸®°¡ °¡´ÉÇÏ°Ô µÇ¸ç fd°¡ À¯È¿ÇÑÁö¿¡ ´ëÇÑ °Ë»çµµ °¡´ÉÇÏ°Ô µË´Ï´Ù. ´Ù¸¸ select()´Â synchronous I/O¿¡ ±â¹ÝÀ» µÐ ÇÔ¼öÀ̹ǷΠÇÑÂÊ¿¡¼­ ºí¶ôÀÌ ´çÇßÀ»¶§ ´Ù¸¥ fd¿¡µµ ¿µÇâÀÌ °¡´Â ´ÜÁ¡ÀÌ ÀÖÀ¸´Ï ÀÌ°ÍÀº ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ÇØ°áÀÌ °¡´ÉÇÕ´Ï´Ù.


¶ÇÇÑ sleep/usleepÀ» ´ëüÇÏ´Â ÇÔ¼ö·Îµµ À¯¿ëÇÕ´Ï´Ù. ¾Æ·¡ Âü°í

int usecsleep(int secs, int usecs)
{
  struct timeval tv;

    tv.tv_sec = secs;
    tv.tv_usec = usecs;

    return select(0, NULL, NULL, NULL, &tv);

}


4.2. select()¸¦ ÀÌ¿ëÇÑ ´ÙÁß¼­¹ö ±¸¼ºÀº ¾î¶»°Ô Çϳª¿ä.?

select()¸¦ ÀÌ¿ëÇÑ ´ÙÁß¼­¹ö ±âº»ÀûÀÎ ±¸¼ºÀº »ý°¢º¸´Ù ½±°Ô Á¦ÀÛÇÒ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡ ¿¹Á¦¸¦ º¸½Ã¸é
int main(void)
{

    socket()
    setsockopt()

    address & port set

    bind()
    listen()

    for(;;) {
        tv value set
        select(fdmax+1, &read_fds, NULL, NULL, &tv)

        for(i = 0; i <= fdmax; i++) {

            if (FD_ISSET(i, &read_fds)) {    /* º¯È­µÈ fd °¨Áö   */

                if (i == listener) {

                    accept()                 /* ½Å±Ô Á¢¼Ó 󸮠  */

                } else {

                    recv()                   /* µ¥ÀÌÅÍ ¼ö½Å ó¸® */
                }
            }
        }

    }

    return 0;
}

¿Í °°ÀÌ ¸¸µé¾î ³¾¼ö ÀÖÀ¸¸ç, ¸¸ÀÏ thread³ª fork¸¦ ÀÌ¿ëÇØ °³º° Á¢¼Ó(°¡Àå ÀϹÝÀûÀÎ °ÍÀÌ °³º° Á¢¼Ó¿¡ ´ëÇÑ ºÐ¸®ÀÌ´Ù)µé¿¡ ´ëÇØ ºÐ¸®¸¦ ¿øÇÒ °æ¿ì


  • accept()ÀÌÈÄ ½Å±Ô ¾²·¹µå/ÇÁ·Î¼¼¼­ »ý¼º
  • select¸¦ »ç¿ëÇÏÁö ¾ÊÀº ¹«ÇÑ ·çÇÁ¼Ó(ÀüÅëÀûÀÎ ´ÙÁß¼­¹ö ±¸¼º)¿¡ ½Å±Ô Á¢¼Ó¿¡ ´ëÇØ ¾²·¹µå/ÇÁ·Î¼¼¼­¸¦ »ý¼ºÇÑÀÌÈÄ °³º° Á¢¼ÓÀÇ ¼Û/¼ö½Å¿¡ µû¶ó select()¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý
  • 1,2¹ø µÎ°¡Áö¸¦ È¥ÇÕÇÏ´Â ¹æ¹ý


¿Í °°ÀÌ ±¸¼ºÀ» ÇÒ¼ö ÀÖÀ¸¸ç ÀÌ°ÍÀº ÀüüÀûÀÎ ½Å±Ô Á¢¼ÓÀÌ ºóÀüÇÑÁö, ȤÀº °³º° Á¢¼Ó ÇÁ·Î¼¼¼­µéÀÇ µ¥ÀÌÅÍ Àü¼Û ºóµµ°¡ ºó¹øÇÑÁö¸¦ ÆÇ´ÜÇؼ­ °áÁ¤ÇÏ¸é µË´Ï´Ù.

4.3. select()°¡ ºí¶ô(Block) ´çÇÕ´Ï´Ù.

½ÇÁ¦ÀûÀ¸·Î select()°¡ ºí¶ô ´çÇÏ´Â°Í À̶ó±â º¸´Ù´Â I/O(read/write)ºÎºÐ¿¡¼­ ±×·¯ÇÑ µ¿ÀÛÀÌ ÀϾ´Ï´Ù. ¿ø·¡ select()´Â Synchronous I/O MultiplexingÀ¸·Î µðÀÚÀÎ µÇ¾î Àֱ⠶§¹®¿¡ select()¸¸ ÀÌ¿ëÇØ ´ÙÁß ¼­¹ö¸¦ ±¸¼ºÇÒ¶§¿¡´Â ÇÑÂÊ fd°¡ ºí¶ôµÇ¾î ÀÖÀ»¶§ ´Ù¸¥ÂÊ¿¡µµ ¿µÇâÀÌ °¡°Ô µË´Ï´Ù. µû¶ó¼­ ÀÌ°ÍÀ» ÇØ°áÇÏ´Â ¹æ¹ýÀº


  • select() ÀÚü¸¸ ÀÌ¿ëÇϸ鼭 I/O NON-Blocking ¹æ¹ýÀ» ÀÌ¿ëÇÑ´Ù.
  • select()+thread or select()+forkµîÀ» Á¶ÇÕÇؼ­ »ç¿ëÇÑ´Ù.


°¡Àå ÁÁÀº ±¸¼ºÀº I/O ÀÚü¸¦ ³Íºí¶ô(Non-Block)À¸·Î ±¸¼ºÇϸ鼭 ¿¡Çø®ÄÉÀÌ¼Ç ºÎºÐ¿¡¼­ ºí¶ôÀ¸·Î ÇÒÁö ¾ÈÇÒÁö¸¦ °æÁ¤Áþ´Â°ÍÀÌ ÁÁ½À´Ï´Ù.

4.4. select()¿¡¼­ ¼³Á¤ÇÑ struct timeval *timeout °ªÀÌ º¯°æµÇ´Â°Í °°½À´Ï´Ù.

ÀÌ ¹®Á¦´Â Ç÷¿Æû¸¶´Ù ´Ù¸£Áö¸¸ SELECT() ÇÔ¼öÀÇ Å¸ÀӾƿô °ªÀº ÃÖÃÊ¿¡ ¼³Á¤ÇÏÁö ¸»°í SELECT() ÇÔ¼ö°¡ ¼ÓÇØÀÖ´Â ¹«ÇÑ loop(º¸Åë ¹«ÇÑ loop¸¦ »ç¿ëÇÏÁÒ)¾È¿¡ ¼³Á¤Çϴ°ÍÀÌ ÁÁ½À´Ï´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â ½Ã°£ÀÌ Áö³²¿¡ µû¶ó struct timevalÀÇ °ªÀÌ Á¡Á¡ ÁÙ¾î µå´Â°ÍÀ» È®ÀÎÇϽǼö ÀÖ½À´Ï´Ù.

4.5. select()¿¡¼­ »ó´ëÆíÀÇ Á¢¼Ó ÇØÁ¦´Â ¾î¶»°Ô ÆÇ´ÜÇÒ¼ö°¡ ÀÖ³ª¿ä.?

recv()¿¡¼­ ¼³¸íÇÏ¿´µíÀÌ recv()ÀÇ ¹Ýȯ°ªÀ» °¡Áö°í ÆÇ´ÜÇÒ¼ö ÀÖ½À´Ï´Ù. Áï, ¹Ýȯ°ªÀÌ 0ÀÏ °æ¿ì¿¡´Â ÀϹÝÀûÀÎ Á¢¼ÓÇØÁ¦¶ó°í ÆÇ´ÜÀÌ µÇ°í ¹Ýȯ°ªÀÌ 0º¸´Ù ÀÛÀ» °æ¿ì(-1)¿¡´Â ¿¡·¯¶ó°í ÆÇ´ÜÀÌ µÇ´Âµ¥ ÀÌ °æ¿ì¿¡´Â µ¥ÀÌÅÍÀÇ Àü¼Û µµÁß¿¡ Á¢¼ÓÀÌ ÇØÁ¦ µÇ°Å³ª Á¢¼Ó ÀÚü¸¦ ÀÒ¾î ¹ö¸®´Â °æ¿ì¶ó°í ÆÇ´ÜÀÌ µÇ¸é µË´Ï´Ù.

4.6. connect() È£Ãâ½Ã ¼­¹ö°¡ ÀÀ´äÇÏÁö ¾ÊÀ» °æ¿ì ÀϽÃÀûÀÎ Áö¿¬ÀÌ ¹ß»ýÇÕ´Ï´Ù.

»ó´ëÃø°ú Á¢¼ÓÀ» ¸ÎÀ»¼ö ¾øÀ»°æ¿ì(Á¢¼Ó °ÅºÎ, ¼­¹ö ´Ù¿îµîµî)¿¡ »ó´ëÃø¿¡¼­ ÀÀ´äÀ» ÇÏÁö ¾Ê´Â Á¢¼ÓºÒ°¡ÀÇ °æ¿ì¿¡´Â ÀÏÁ¤ÇÑ ½Ã°£µ¿¾È BLOCK Çö»óÀÌ ¹ß»ýÇÕ´Ï´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â connect() È£Ãâ½Ã¿¡ Àá½Ãµ¿¾È ½Ã½ºÅÛÀ» NON-BLOCK ¸ðµå·Î ¼³Á¤ÇÑÈÄ¿¡ Á¢¼ÓÀ» ½ÃµµÇϴ°ÍÀÌ ÁÁ½À´Ï´Ù.

ÁÖÀÇ ÇÒÁ¡Àº NON-BLOCK ¸ðµå¸¦ ÀÌ¿ëÇØ Á¢¼ÓÀ» ½ÃµµÇÒ¶§¿¡´Â connect()°¡ Áï½Ã ¿¡·¯¸¦ ¹ÝȯÇÏÁö¸¸ ¹Ýȯ°ªÀÌ ¾Æ´Ñ ¿¡·¯°ªÀ» °¡Áö°í ÆÇ´ÜÇØ¾ß ÇÕ´Ï´Ù. ¿¡·¯°ªÀÌ ECONNREFUSED¿Í °°Àº °è¿­ÀÌ ¾Æ´Ñ EINPROGRESS ÀÏ °æ¿ì¿¡´Â Á¤»óÀûÀÎ Á¢¼Ó¿¡·¯°¡ ¾Æ´Ñ Á¢¼ÓÀ» ¸Î±â À§ÇØ ½ÃµµÁßÀÓÀ» ¾Ë¼ö°¡ ÀÖ½À´Ï´Ù. ±×ÈÄ SEELCT()¸¦ ÀÌ¿ëÇÏ¿© Á¤»óÀûÀ¸·Î ¾²±â °¡´ÉÇÑ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ¾òÀ»¼ö ÀÖ´ÂÁö È®ÀÎÇؼ­ Á¢¼ÓÀ» ¸Î°Å³ª Á¢¼Ó ½ÇÆп¡ ´ëÇÑ ¹Ýȯ°ªÀ» ¾ò¾î³»¾ß¸¸ ÇÕ´Ï´Ù. À̶§ ÀÏÁ¤ ½Ã°£µ¿¾È Á¢¼ÓÀ» ½ÃµµÇÒÁö¿¡ ´ëÇÑ ÆÇ´ÜÀº SEELCT()ÀÇ Å¸ÀӾƿô °ªÀ» Á¶Á¤ÇÏ½Ã¸é µË´Ï´Ù.

Âü°í : ƯÁ¤ Ç÷¿Æû, ȤÀº ¿¡Çø®ÄÉÀ̼ǿ¡ µû¶ó SEELCT()ÀÇ Å¸ÀӾƿôÀ» Á¶Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. Áï, ƯÁ¤ Ç÷¿Æû¿¡ µû¶ó¼­´Â ÃÖ¼ÒÇÑ 3ÃÊ ÀÌ»óÀÇ Å¸ÀӾƿôÀ» ÁÖ¾î¾ß¸¸ Á¢¼ÓÀÌ ¸Î¾îÁö°í ±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â Á¢¼Ó °ÅºÎ ·Î ÆǴܵǴ °æ¿ì°¡ »ý±é´Ï´Ù. ¿©·¯ Ç÷¿Æû¿¡ žÀçÇÑ °æÇèÀ¸·Î´Â Á¢¼Ó ŸÀӾƿôÀº 5ÃÊ°¡ °¡Àå Àû´çÇÑ ½Ã°£ÀÌ ¾Æ´Ò±î »ý°¢µË´Ï´Ù.(Ç÷§Æû/¿¡Çø®ÄÉÀ̼ǿ¡ µû¶ó ÀÌ·¯ÇÑ °æ¿ì°¡ »ý±â´Â ÀÌÀ¯¿¡ ´ëÇØ °æÇèÀÌ ÀÖÀ¸½Ã°Å³ª ¾Æ½Ã´ÂºÐÀº Æ÷½ºÆà ÇØÁֽñ⠹ٶø´Ï´Ù)
    socket()
    set_nonblock
    rc = connect()

    if ( (status < 0) && ( (errno == EINPROGRESS) || (errno == EAGAIN) )  ) {
        while() {
            select()
            connect()
        }
    }

    if (status >= 0 ) {     /* Á¤»ó Á¢¼Ó */

    } else {               /* Á¢¼Ó ¿¡·¯ */

    }
ȤÀº º¸´Ù ¼Õ½¬¿î ¹æ¹ýÀ¸·Î´Â alarm()À» ÀÌ¿ëÇϴ°͵µ ÀÖ½À´Ï´Ù.
    signal(SIGALRM, timeout);
    alarm(1);
    connect()
    alarm(0);

4.7. À§ÀÇ ¹æ¹ýÀ» µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã¿¡µµ Àû¿ëÀÌ °¡´ÉÇÑ°¡¿ä.?

³×, °¡´ÉÇÕ´Ï´Ù. Á¢¼Ó ½Ã°£¿¡ ´ëÇÑ Å¸ÀӾƿôÀ» Á¤ÇϵíÀÌ µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã¿¡µµ À§¿Í °°ÀÌ select()¸¦ ÀûÀýÈ÷ Á¶ÇÕÇؼ­ ŸÀӾƿôÀ» ÁöÁ¤ÇÒ¼öµµ ÀÖ½À´Ï´Ù. ´Ù¸¸ ÁÖÀÇ ÇϽÇÁ¡Àº select()ÀÇ ºñÆ® ¸¶½ºÅ© üũ°¡ read/write ÀÎÁö üũÇÏ´Â ºÎºÐÀÔ´Ï´Ù.

4.8. send()¸¦ È£ÃâÇÏ¿© µ¥ÀÌÅÍ Àü¼Û½Ã PIPE ½Ã±×³ÎÀÌ ¹ß»ýÇÕ´Ï´Ù.

PIPE ½Ã±×³ÎÀº ÀÌ¹Ì ´ÝÇôÁ®ÀÖ´Â µð½ºÅ©¸³Å͸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ¼Û½ÅÇÏ·Á°í ÇÒ¶§ ¹ß»ýÇÕ´Ï´Ù. Áï, µð½ºÅ©¸³ÅÍ ¹øÈ£´Â Á¸ÀçÇÏÁö¸¸ »ó´ëÃø ȤÀº ÀÌÂÊ¿¡ ÀÇÇØ ÀÌ¹Ì Â÷´ÜÀÌµÈ ¾µ¸ð°¡ ¾ø¾îÁø µð½ºÅ©¸³ÅÍÀÔ´Ï´Ù. ÀÌ°ÍÀ» ¹æÁöÇϱâ À§Çؼ­´Â µ¥ÀÌÅÍ ¼Û½Å½Ã select()¸¦ ÀÌ¿ëÇÏ¿© ¾²±â °¡´ÉÇÑ ÆÄÀÏ µð½ºÅ©¸³ÅÍÀÎÁö È®ÀÎÇÏ¿©(select()ÀÇ µÎ¹ø° ÀÎÀÚ) Àü¼ÛÀ» Çϸç PIPE ½Ã±×³Î ÀÚü°¡ º°´Ù¸¥ 󸮸¦ ¿äÇÏ´Â ½Ã±×³ÎÀÌ ¾Æ´Ï¹Ç·Î ½Ã½ºÅÛ ½ÃÀÛÈ÷ PIPE ½Ã±×³Î ÀÚü¸¦ ¹«½ÃÇÏ°Ô ¸¸µé¾î ³õ´Â°Íµµ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.


Âü°í : PIPE ½Ã±×³ÎÀ» ¹«½ÃÇϵµ·Ï Çسõ¾Ò¾Æµµ µð¹ö±ë ¸ðµå¿¡¼­´Â ½ÇÁ¦·Î ÆÄÀÌÇÁ ½Ã±×³Î¿¡ ÀÇÇØ ¼¼±×¸ÕÆ® ÆúÆ® ¿¡·¯°¡ ³³´Ï´Ù. ±×¸®°í PIPE ½Ã±×³Î¿¡ ´ëÇÑ Ã³¸®°¡ ¾øÀ¸¸é ½Ã±×³Î ¹ß»ý½Ã ¿¡Çø®ÄÉÀ̼ÇÀÌ Å©·¹½¬ÇÏ´Â ¿øÀÎÀÌ µÇ±âµµ ÇÕ´Ï´Ù.(½ÇÁ¦ Å©·¹½¬ÇÕ´Ï´Ù)

4.9. select()¸¦ ÀÌ¿ëÇߴµ¥ CPU »ç¿ë·®ÀÌ °ÆÁ¤µË´Ï´Ù.

select()´Â ÃÖ´ë fd¸¦ óÀ½ºÎÅÍ ³¡±îÁö ȸÀüÇϸ鼭 º¯°æµÇ´Â fd¸¦ °¨ÁöÇϱ⠶§¹®¿¡ ÀÏÁ¾ÀÇ poll ¹æ½ÄÀ» äÅÃÇϴ°ÍÀ̳ª ÀüÅëÀûÀÎ ÇÁ·Î¼¼½º ¹æ½ÄÀÇ ´ÙÁß¼­¹ö¿¡ ºñÇØ CPU »ç¿ë·®Àº Áö±ØÈ÷ Àû½À´Ï´Ù.

4.10. select()¸¦ ÀÌ¿ëÇϴµ¥ °¡²û CPU°¡ 100%¿¡ À̸¨´Ï´Ù.

ÀÌ°ÍÀº ¿©·¯°¡Áö ¿øÀÎ(½Ã±×³Î/Á¶°ÇºÐ±â/select ¿¡·¯µîµî)Àϼö°¡ Àִµ¥ select()¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö¿¡¼­ ¿¡·¯Ã³¸® ¹ÌÈíÀ¸·Î ¹ß»ýÇÏ´Â ¹®Á¦ÀÔ´Ï´Ù. ¼­¹ö ½Ã½ºÅÛÀ» ±¸µ¿Çϱâ Àü¿¡ ¹Ýµå½Ã ´Ù¾çÇÑ È¯°æ¿¡¼­ Å×½ºÆ®¸¦ ¸¶Ä£ÈÄ¿¡ ¼³Ä¡Çϴ°ÍÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù. ¶ÇÇÑ ´ëºÎºÐÀÇ select()´Â ÀÏÁ¤ÇÑ ¹«ÇÑ·çÇÁ ¾È¿¡¼­ µ¿ÀÛÇÏ°Ô µÇ´Âµ¥ ¹«ÇÑ·çÇÁ°¡ ȯ¿øµÇ´Â ½ËÁ¡¿¡¼­ 1ÃÊ À̳»ÀÇ ¹Ì¼¼ÇÑ sleepÀ» Áִ°͸¸À¸·Î ÀÌ·¯ÇÑ ¹®Á¦¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÒ¼ö´Â ÀÖÀ¸³ª ±Ùº»ÀûÀÎ ÇØ°áÀº ¾Æ´Õ´Ï´Ù.

4.11. select()°¡ ¼ö¿ë°¡´ÉÇÑ ÃÖ´ë fd°ªÀº ¾ó¸¶ÀԴϱî.?

select()ÀÇ fd_set´Â ºñÆ® ¸¶½ºÅ© À̱⠶§¹®¿¡ ¹Ì¸® Á¤ÀÇµÈ Å©±â¸¦ °®°í ÀÖÀ¸¸ç ±× Å©±â´Â Ç÷¿Æû¿¡ µû¶ó¼­ ´Ù¸£°Ô ¼³Á¤ÀÌ µÇ¾î ÀÖ½À´Ï´Ù. ¸®´ª½º ½Ã½ºÅÛÀÇ °æ¿ì¿¡´Â Ä¿³ÎÀ» Àç ÄÄÆÄÀÏÇÔÀ¸·Î¼­ ÇØ°áÇÒ¼ö ÀÖÀ¸¸ç SolarisÀÇ °æ¿ì¿¡´Â..


À̺κÐÀº ¿¹Á¦¸¦ ¸¸µé¾î ´Ù½Ã ¸¸µé¾î ¿Ã¸®°Ú½À´Ï´Ù.

4.12. select()¸¦ ÀÌ¿ëÇØ ½Ã¸®¾ó ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ°¡¿ä.?

³× °¡´ÉÇÕ´Ï´Ù. ÀÌ FAQ¿¡¼­´Â TCP SOCKET¸¸À» ´Ù·ç°í ÀÖÀ¸¹Ç·Î ÀÚ¼¼ÇÑ°ÍÀº ½Ã¸®¾ó ÇÁ·Î±×·¡¹Ö °ü·Ã ¹®¼­µéÀ» ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù.


4.13. select()¸¦ ÀÌ¿ëÇÑ ¸Þ½ÃÁöÅ¥°¡ °¡´ÉÇÑ°¡¿ä.?

¸Þ½ÃÁöÅ¥´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ±â¹ÝÀ¸·Î ÀÛµ¿µÇ´Â ½Ã½ºÅÛÀÌ ¾Æ´Ï¶ó¼­ ±âº»ÀûÀ¸·Î´Â ºÒ°¡´ÉÇÕ´Ï´Ù¸¸, ¸Þ½ÃÁöÅ¥ ID¸¦ ÆÄÀϵð½ºÅ©¸³ÅÍ¿¡ ´ëĪ½ÃÅ°´Â ¹æ¹ýÀ¸·Î °¡´ÉÇÏ°Ô ÇÒ¼ö°¡ ÀÖ½À´Ï´Ù. ¾Æ·¡ ¸µÅ©¿¡ ÀÌ¿Í °ü·ÃµÈ Èï¹Ì·Î¿î ±â»ç°¡ ÀÖ½À´Ï´Ù. ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù.


5.2 POLL

4.14. ¼­¹ö ÇÁ·Î±×·¥¿¡ Á»ºñ ÇÁ·Î¼¼¼­°¡ »ý±é´Ï´Ù.

ÇÁ·Î¼¼¼­ ¹æ½Ä(FORK)ÀÇ ¼­¹ö ¸ðµ¨¿¡¼­ ¼­¹ö ÇÁ·Î¼¼¼­(ÀÚ½Ä)ÀÇ Á¾·á½Ã exitÀ̳ª ¿©Å¸ ¹æ¹ýÀ¸·Î ÇÁ·Î¼¼¼­¸¦ Á¾·áÇϸé ÀÌ¿Í °°Àº Á»ºñ ÇÁ·Î¼¼¼­°¡ ¹«ÇÑÁ¤ °è¼Ó »ý°Ü³³´Ï´Ù. À̸¦ ÇØ°áÇÏ´Â ¹æ¹ýÀº ÀÚ½Ä ÇÁ·Î¼¼¼­ÀÇ Á¾·á½Ã 'SIGCHLD' ½ÅÈ£¸¦ µî·ÏÇÏ¿© waitpid()·Î ó¸®ÇØÁÖ´Â ¹æ¹ýÀÔ´Ï´Ù.
 struct sigaction sigchild;
 sigchild.sa_handler = sighandler;
 sigchild.sa_flags = 0;
 sigemptyset(&sigchild.sa_sigset );
 sigaction(SIGCHLD , &sigchild , 0);

 void sighandler(int signo ) {
    while ( waitpid( -1 , 0 , WNOHANG ) > 0 ) ;
 }

5. HTTP ÇÁ·ÎÅäÄÝ

5.1. HTTP ÇÁ·Î±×·¥Àº ¾î¶»°Ô ½ÃÀÛÇØ¾ß Çϳª¿ä.?

HTTP»Ó¸¸ ¾Æ´Ï¶ó FTP ÇÁ·Î±×·¥µµ RFC¸¦ ¸ÕÀú ÀÐ¾î º¸½Ã´Â°ÍÀÌ °¡Àå ºü¸¥±æÀÔ´Ï´Ù. ƯÈ÷¾Æ HTTP/1.0°ú HTTP/1.1ÀÌ ¸¹Àº Â÷À̸¦ º¸ÀÌ°í ÀÖÀ¸¹Ç·Î RFC¹®¼­¸¦ ÇʼöÀûÀ¸·Î º¸¼Å¾ß¸¸ ÇÕ´Ï´Ù. ±×ÈÄ HTTP´Â ÀϹÝÀûÀÎ TCP/IP Åë½Å°ú °ÅÀÇ À¯»çÇϹǷΠƯº°È÷ ¹æ´ëÇÑ ¾çÀÇ ºê¶ó¿ìÀúÀÇ ¼Ò½º¸¦ È®ÀÎÇϽñ⠺¸´Ù´Â Á÷Á¢ ÄÚµùÀ» ÇϽô°͵µ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.

[http]RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0

[http]RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1

°¡Àå ÀϹÝÀûÀÎ HTTP ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÑ Åë½ÅÀº ±âº»ÀûÀÎ TCP/IPÅë½Å¿¡ HTTP ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇϴ°ÍÀÌ ÁÖ¸¦ ÀÌ·ç¹Ç·Î
 [POST¹æ½Ä]
1. Á¢¼Ó
2. HTTP Çì´õ Àü¼Û[HTTP¹öÀü¹× Àü¼ÛµÇ´Â µ¥ÀÌÅÍÀÇ »çÀÌÁîµîµî]
3. HTTP ¹Ùµð(³»¿ë) Àü¼Û [ÁÖ·Î ÁúÀÇ ³»¿ë¿¡ ÇØ´ç]
4. HTTP Çì´õ ¼ö½Å[HTTP¹öÀü¹× Àü¼ÛµÇ´Â µ¥ÀÌÅÍÀÇ »çÀÌÁîµîµî]
5. HTTP ¹Ùµð(³»¿ë) ¼ö½Å [ÁúÀÇ °á°ú¿¡ ÇØ´ç]

[GET¹æ½Ä]
1. Á¢¼Ó
2. HTTP Çì´õ Àü¼Û[HTTP¹öÀü¹× Àü¼ÛµÇ´Â µ¥ÀÌÅÍÀÇ »çÀÌÁîµîµî]
3.
4. HTTP Çì´õ ¼ö½Å[HTTP¹öÀü¹× Àü¼ÛµÇ´Â µ¥ÀÌÅÍÀÇ »çÀÌÁîµîµî]
5. HTTP ¹Ùµð(³»¿ë) ¼ö½Å [ÁúÀÇ °á°ú¿¡ ÇØ´ç]
¿Í °°Àº ÇÁ·Î½ÃÁ®¸¦ µû¸¨´Ï´Ù. »ý°¢º¸´Ù ¾î·ÆÁö´Â ¾ÊÀ¸³ª ±Ô¾àÀ» µû¸£´Â°ÍÀÌ ¹«¾ùº¸´Ù Áß¿äÇÕ´Ï´Ù.


5.1.1. HTTP¸¦ ÅëÇÏ¿© ÆÄÀÏ ¼Û¼ö½ÅÀÌ °¡´ÉÇÑ°¡¿ä.?

³×, °¡´ÉÇÕ´Ï´Ù. ÀÏ¹Ý ÆÄÀÏ ¼Û¼ö½Å°ú µ¿ÀÏÇÏ°Ô ÇÏ´Â ¹æ¹ý°ú BASE64 ÄÚµå·Î ÀÎÄÚµùµÈ ÀڷḦ ¼Û/¼ö½ÅÇÏ´Â µÎ°¡Áö ¹æ¹ýÀÌ ¾²Àϼö°¡ ÀÖ½À´Ï´Ù. ´Ù¸¸ BASE64 ÄÚµå·Î ¼Û/¼ö½Å½Ã¿¡´Â ¿øº»ÀÇ Å©±âº¸´Ù Á¶±Ý´õ ¾à 1.6¹è ´Ã¾î³ª´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¾Æ·¡´Â BASE64 de/encode ¿¹Á¦ÀÔ´Ï´Ù. ¶ÇÇÑ ÆÄÀÏÀÇ Å©±â¸¦ À§Çؼ­ HTTP Çì´õ¿¡ Ç¥½ÃµÇ´Â Content-Length¸¦ Áß¿äÇÏ°Ô ´Ù·ï¾ß¸¸ ÇÒ°ÍÀÔ´Ï´Ù.


/*------ Base64 Encoding Table ------*/
static const char MimeBase64[] = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '+', '/'
};

/*------ Base64 Decoding Table ------*/
static int DecodeMimeBase64[256] = {
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 00-0F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 10-1F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,  /* 20-2F */
    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,  /* 30-3F */
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,  /* 40-4F */
    15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,  /* 50-5F */
    -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,  /* 60-6F */
    41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,  /* 70-7F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 80-8F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 90-9F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* A0-AF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* B0-BF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* C0-CF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* D0-DF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* E0-EF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1   /* F0-FF */
    };

int base64_decode(char *text, unsigned char *dst, int numBytes )
{
  const char* cp;
  int space_idx = 0, phase;
  int d, prev_d = 0;
  unsigned char c;

    space_idx = 0;
    phase = 0;

    for ( cp = text; *cp != '\0'; ++cp ) {
        d = DecodeMimeBase64[(int) *cp];
        if ( d != -1 ) {
            switch ( phase ) {
                case 0:
                    ++phase;
                    break;
                case 1:
                    c = ( ( prev_d << 2 ) | ( ( d & 0x30 ) >> 4 ) );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    ++phase;
                    break;
                case 2:
                    c = ( ( ( prev_d & 0xf ) << 4 ) | ( ( d & 0x3c ) >> 2 ) );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    ++phase;
                    break;
                case 3:
                    c = ( ( ( prev_d & 0x03 ) << 6 ) | d );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    phase = 0;
                    break;
            }
            prev_d = d;
        }
    }

    return space_idx;

}

int base64_encode(char *text, int numBytes, char **encodedText)
{
  unsigned char input[3]  = {0,0,0};
  unsigned char output[4] = {0,0,0,0};
  int   index, i, j, size;
  char *p, *plen;

  plen           = text + numBytes - 1;
  size           = (4 * (numBytes / 3)) + (numBytes % 3? 4 : 0) + 1;
  (*encodedText) = malloc(size);
  j              = 0;

    for  (i = 0, p = text;p <= plen; i++, p++) {
        index = i % 3;
        input[index] = *p;

        if (index == 2 || p == plen) {
            output[0] = ((input[0] & 0xFC) >> 2);
            output[1] = ((input[0] & 0x3) << 4) | ((input[1] & 0xF0) >> 4);
            output[2] = ((input[1] & 0xF) << 2) | ((input[2] & 0xC0) >> 6);
            output[3] = (input[2] & 0x3F);

            (*encodedText)[j++] = MimeBase64[output[0]];
            (*encodedText)[j++] = MimeBase64[output[1]];
            (*encodedText)[j++] = index == 0? '=' : MimeBase64[output[2]];
            (*encodedText)[j++] = index <  2? '=' : MimeBase64[output[3]];

            input[0] = input[1] = input[2] = 0;
        }
    }

    (*encodedText)[j] = '\0';

    return 0;
}

5.2. HTTP Åͳθµ(TUNNELING)Àº ¹«¾ùÀΰ¡¿ä.?

ÀÌ°ÍÀº Çö´ë¿¡ µé¾î¿Í ¹æÈ­º®ÀÌ »ç³» ³×Æ®¿÷ÀÇ ÁÖ¸¦ ÀÌ·ç¸é¼­ »ý°Ü³­ ¹®Á¦ÀÔ´Ï´Ù. Áï, ¸¹Àº ȸ»çµéÀÌ »ç³» ³×Æ®¿÷¿¡ 80(HTTP)Æ÷Æ®¸¦ Á¦¿ÜÇÑ ´ëºÎºÐÀÇ Æ÷Æ®¸¦ º¸¾È»óÀÇ ÀÌÀ¯(»ó´çºÎºÐ ¹æÈ­º® °ü¸®ÀÚÀÇ ¹«°ü½É)·Î ´Ý¾Æ ³õÀ¸¸é¼­ Á¤ÀÛ ÇÊ¿äÇÑ Æ÷Æ®¸¦ È°¼ºÈ­ÇØ »ç¿ëÇϱâ Èûµç ¾î·Á¿òÀ» ÇÇÇÏ°íÀÚ »ý°Ü³­ ÀÏÁ¾ÀÇ Æ®¸¯ÀÔ´Ï´Ù.

ƯÈ÷³ª »ó´ç¼öÀÇ È¸»ç°¡ ¸Þ½ÅÀú/Áõ±Ç´Ü¸»±â/¿ÜºÎ À̸ÞÀÏ/°ÔÀÓ/±âŸ Æ÷¸£³ë»çÀÌÆ®µîÀÇ ÇÇÇظ¦ º¸°Ô µÇ¸é¼­ ȸ»ç°¡ ±ÔÁ¤ÇÏ´Â Åë½Å Æ÷Æ® ÀÌ¿Ü¿¡´Â ´Ý¾Æ ³õ°í ÇÊ¿ä¿¡ ÀÇÇؼ­ ¿­°ÔµÇÁö¸¸ ½ÇÁ¦ 80Æ÷Æ®¸¦ Á¦¿ÜÇÑ ´Ù¸¥ Æ÷Æ®ÀÇ °³¹æÀº Çö½ÇÀûÀ¸·Î Èûµç°ÍÀÌ »ç½ÇÀÔ´Ï´Ù. µû¶ó¼­ ÁÖ¼Ò¹× Æ÷Æ® Æ÷¿öµù ±â¼úÀ» ÀÌ¿ëÇÑ°ÍÀ¸·Î Å©°Ô Åͳθµ Ŭ¶ó¸®¾ðÆ®¿Í ¼­¹ö·Î ±¸¼ºÀÌ µË´Ï´Ù.


Ŭ¶óÀ̾ðÆ®(ÀÏ¹Ý ¿¡Çø®ÄÉÀ̼Ç)´Â TUNNELING CLIENT·Î Á¤»óÀûÀÎ Á¢¼ÓÀ» ÇÏÁö¸¸(¿ÜºÎÀÇ ¿¡Çø®ÄÉÀÌ¼Ç ¼­¹ö°¡ ¾Æ´Ô) TUNNELING CLIENT´Â ¹æÈ­º®À» Åë°ú Çϱâ À§ÇØ Æ÷Æ®¸¦ 80Æ÷Æ®¸¦ »ç¿ëÇϵµ·Ï ±³Ã¼ Çϰųª ³»ºÎ ÆÐŶÀ» °Ë»çÇÏ´Â ¹æÈ­º®À̶ó¸é HTTP Çì´õ¸¦ ºÙ¿©Áְųª ¹æÈ­º® ÀÎÁõÀ» ¿äÇÏ´Â ¹æÈ­º®ÀÇ °æ¿ì ¹æÈ­º® ÀÎÁõÀ» Çϵµ·Ï µµ¿ÍÁָ鼭 ¿ÜºÎ ¼­¹öÀÇ ¹æÈ­º®(½ÇÁ¦ Á¸Àç À¯¹«´Â ¹«½Ã)±îÁö µµ´ÞÇÏ°Ô ÇÕ´Ï´Ù. ÀÌÈÄ Åͳθµ ¼­¹ö´Â ³»ºÎ ¿¡Çø®ÄÉÀ̼ǿ¡ ¸Â°Ô Æ÷Æ®³ª ÁÖ¼ÒµîÀ» Æ÷¿öµù ÇØÁִ°ÍÀÔ´Ï´Ù.


 [ Ŭ¶óÀ̾ðÆ® »ç³» ³×Æ®¿÷ ]
 CLIENT        TUNNELING CLIENT      FIREWALL
          --->                  --->

 ------------------------------------------------------

 [ ¼­¹ö       »ç³» ³×Æ®¿÷ ]
 FIREWALL      TUNNELING SERVER      APPLICATION SERVER
          --->                  --->



ÇÏÁö¸¸ HTTP Åͳθµ¿¡´Â »ç¿ëÀÚ ÀÎÁõÀ̳ª Á¢¼ÓÀ¯Áöµî º¸¿ÏÇؾßÇÒ ¹®Á¦Á¡ÀÌ ¸¹ÀÌ µµ»ç¸®°í ÀÖÀ¸¹Ç·Î ÀÌ°Í ÀÚü°¡ ¸¸´ÉÀº ¾Æ´Õ´Ï´Ù. ¶ÇÇÑ ÁÖ¼Ò¹× Æ÷Æ®¸¦ Æ÷¿öµù ÇØÁÖ´Â °úÁ¤¿¡¼­ »ý±â´Â ÆÐŶ ÀÚüÀÇ ¼Óµµ ÀúÇϸ¦ ¿°µÎ¿¡ µÎ¾î¾ß¸¸ ÇÕ´Ï´Ù.


5.3. HTTP 3-4°³ ´õ ´Ù·çÀÚ


6. À̱âÁ¾°£ÀÇ µ¥ÀÌÅÍ ¼Û/¼ö½Å


6.1. À̱âÁ¾°£ÀÇ µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã ÀÌ»óÇÑ µ¥ÀÌŸ°¡ È®Àε˴ϴÙ.

À̱âÁ¾°£ÀÇ Åë½Å½Ã µ¥ÀÌÅÍÀÇ Àü¼ÛÀÌ char ¹öÆÛ°¡ ¾Æ´Ñ int/long/floatÇüµîÀ¸·Î ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇØ Åë½ÅÇÏ°íÀÚ ÇÒ°æ¿ì¿¡ Ç÷¿Æû¿¡ µû¶ó¼­ ¹ÙÀÌÆ® ¿À´õ°¡ ´Þ¶ó¼­ »ý±â´Â ¹®Á¦ÀÔ´Ï´Ù.


´ëºÎºÐÀÇ x86°è¿­ÀÇ CPU¸¦ »ç¿ëÇÏ´Â ¸®´ª½º ½Ã½ºÅÛÀº little endianÀ» äÅÃÇÏ°í ÀÖ°í AIX/SOLARISµîÀÇ À¯´Ð½º´Â big endianÀ» äÅÃÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ÆíÀÇ»ó OS Ç÷¿ÆûÀ» ¸»¾¸ µå·ÈÀ¸´Ï ½ÇÁ¦·Î´Â CPU¸¦ ±âÁØÀ¸·Î ÆÇ´ÜÇϼž߸¸ ÇÕ´Ï´Ù.


big endian½Ã½ºÅÛÀº ¸Þ¸ð¸®¿¡ µ¥ÀÌÅÍ°¡ ¾º¿©Áú¶§ HI --> LOW ¼øÀ¸·Î ¾º¿©ÁöÁö¸¸ little endian ½Ã½ºÅÛÀº LOW -- >HI ¼øÀ¸·Î µ¥ÀÌÅÍ°¡ ¾º¿©Áö¸é¼­ ¹ß»ýÇÕ´Ï´Ù.


¿¹¸¦ µé¸é 4¹ÙÀÌÆ® Á¤¼öÇü µ¥ÀÌÅÍ(0x01020304)°¡ Á¸ÀçÇÒ¶§

  Big Endian:    01  02  03  04
  Little Endian: 04  03  02  01

¿Í °°ÀÌ ¸Þ¸ð¸®¿¡ ÀúÀåÀÌ µË´Ï´Ù.


µû¶ó¼­ C/S ½Ã½ºÅÛÀÇ °æ¿ì¿¡´Â ´ëºÎºÐÀÇ Å¬¶óÀ̾ðÆ®°¡ x86°è¿­À» äÅÃÇÏ°í ÀÖÀ¸¹Ç·Î ¼­¹öÃø¿¡¼­ ¿£µð¾ÈÀ» º¯°æÇØÁִ°ÍÀÌ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù. ¾Æ·¡´Â °£´ÜÇÑ ¹ÙÀÌÆ® ¿À´õ º¯È¯ ÇÔ¼öÀÔ´Ï´Ù.

unsigned long int ChangeEndian(unsigned long int uiInput)
{
    return ( uiInput >> 24 ) | ( ( uiInput >> 8 ) & 0x0000FF00 ) \
       | ( ( uiInput <<  8 ) & 0x00FF0000 ) | ( uiInput << 24 );
}


6.2. ±¸Á¶Ã¼ ¼±¾ð½Ã Å©±â°¡ ´Ù¸£°Ô ³ª¿É´Ï´Ù.(¹ÙÀÌÆ® Æеù)

ÀÌ·¡¿Í °°Àº ±¸Á¶Ã¼ ¼±¾ð½Ã ÄÄÆÄÀÏ·¯°¡ Äڵ带 ÃÖÀûÈ­ Çϱâ À§ÇØ¿© °¢°¢ÀÇ ±¸Á¶Ã¼ ¸â¹öµéÀ» 4¹ÙÀÌÆ® ¹Ù¿î´õ¸®·Î ¸ÂÃß°Ô ¹Ù²Ù¾î ¹ö¸³´Ï´Ù. Áï, 1¹ÙÀÌƮ¥¸® char phase1´Â µÚ¿¡ 3°³ÀÇ Æеù ¹ÙÀÌÆ®¸¦ µ¡ºÙÀÌ°í char end1 ¿ª½Ã 3¹ÙÀÌÆ®¸¦ ÆеùÇÏ°Ô µË´Ï´Ù.


ÀÌ¿Í °°Àº ¹®Á¦´Â ´ëºÎºÐ sizeof(±¸Á¶Ã¼)¿Í °°Àº Çü½ÄÀ» ÀÌ¿ëÇÒ¶§ ¿¹»óÇÏÁö ¾ÊÀº »çÀÌÁî°¡ µ¹ÃâµÇ¾î ¹®Á¦°¡ ¹ß»ýÇÒ¶§ ÀÌ¿ëÇϸé À¯¿ëÇÕ´Ï´Ù. ¾Æ·¡ ±¸Á¶Ã¼ ¿É¼ÇµéÀº ÄÄÆÄÀϽà ¹ÙÀÌÆ® ÆеùÀ» ÇÏÁö ¾Ê°í ±×´ë·Î ÀÌ¿ëÇϵµ·Ï ¸¸µé¾î Áִ°ÍÀÔ´Ï´Ù.

#ifdef X86

typedef struct _HEADER_
{
  char phase[1];
  int  length;
  char end[1];
}__attribute__((packed)) _HEADER;

#elif AIX

#pragma options align=packed

typedef struct _HEADER_
{
  char phase[1];
  int  length;
  char end[1];
}_HEADER;

#pragma options align=reset

#elif HPUX

#pragma HP_ALIGN NOPADDING

typedef struct _HEADER_
{
  char phase[1];
  int  length;
  char end[1];
}_HEADER;

#pragma HP_ALIGN HPUX_NATURAL

#endif


6.3. XDRÀº ¹«¾ùÀΰ¡¿ä.?


¼³¸í¹× ¾à°£ÀÇ ¿¹Á¦ http://www.faqs.org/rfcs/rfc1014.html


7. º¸¾ÈÇÁ·Î±×·¡¹Ö

7.1. SSL

7.2. PKI


8. UDP

8.1. UDP

8.2. BROADCAST

8.3. MULTICAST


¼ö°íÇϽʴϴ٠^^ --¹ÚÀ±Àç

KLDPStyleÀ» Âü°íÇϼ¼¿ä.

ÀÌÁ¦ ¿©·¯ºÐµé²²¼­ ¼öÁ¤/Ãß°¡/»èÁ¦ ÇØÁÖ¼¼¿ä. Àúµµ Æ´Æ´È÷ ÇÏ°Ú½À´Ï´Ù. ÁÖÁ¦ ºÎºÐÀº Á»´õ Ãß°¡ÇÏ´Ù·Ï ÇÏ°Ú½À´Ï´Ù. º¸¾ÈÂÊÀº ´ÙÀ½ÁÖÁß¿¡ Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù.

ID
Password
Join
Even the smallest candle burns brighter in the dark.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-03-14 15:31:23
Processing time 0.0177 sec