· 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
You will be awarded a medal for disregarding safety in saving someone.


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.0160 sec