· 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
He who has imagination without learning has wings but no feet.


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