CSocketFAQ
C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ
±èÇѼö iryna7@yahoo.com
2003.11.30
Unix/Linux ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇϽô ºÐµéÀÌ °¡Àå ¸¹ÀÌ °ü½ÉÀ» °®´Â ºÐ¾ß´Â ¾Æ¹«·¡µµ ¼ÒÄÏ Åë½Å ºÐ¾ß°¡ ¾Æ´Ò±î »ý°¢ÀÌ µË´Ï´Ù. ±×·¯³ª ÈǸ¢ÇÑ ±³°ú¼¿Íµµ °°Àº ¼ÀûµéÀÌ Á¸ÀçÇÔ¿¡µµ ºÒ±¸ÇÏ°í °æÇèÀڵ鸸ÀÌ ¾Ë°í ÀÖ´Â ÀÌ·± Àú·± ¹®Á¦ ÇØ°áÃ¥µéÀ» óÀ½ ½ÃÀÛ ÇÏ´Â ºÐµé¿¡°Ô Á¦°øÇص帮°íÀÚ C ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö FAQ¸¦ Á¦ÀÛÇÕ´Ï´Ù. ÀÌ°ÍÀº ¾î´À ´©±¸ ÇѸíÀÇ ÀúÀÛ¹°ÀÌ ¾Æ´Ñ ¿©·¯ ¸ðµÎÀÇ °øµ¿ ÀúÀÛ¹°ÀÔ´Ï´Ù. ºÎµð ÀÌ ÀÛÀº ½ÃÀÛÀ¸·Î ºÎÅÍ Ä¿´Ù¶õ Unix/Linux °øµ¿Ã¼¸¦ Å°¿ö³ª°¡½Ã±æ ±â¿øÇÕ´Ï´Ù.
Contents
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.1. TCP/IP Åë½ÅÀÇ °¡Àå Ä¿´Ù¶õ Ư¡Àº ¹«¾ùÀԴϱî. ¶ÇÁ·Î±×·¡¸Ó·Î¼ TCP/IPÀÇ ¿©·¯ Ãø¸éÀ» ¾Ë¾Æ º¸´Â°ÍÀº ÁÁÀ¸³ª °¡Àå Áß¿äÇÑ ¸î°¡Áö°¡ Ư¼ºÀÌ ÀÖ½À´Ï´Ù. ±×°ÍÀº
2.2. TCP/IP ÇÁ·Î±×·¡¹Ö Ãʺ¸ÀÚÀÔ´Ï´Ù. Ã¥À̳ª »çÀÌÆ® Ãßõ ºÎŹµå¸³´Ï´Ù. ¶TCP/IP ÇÁ·Î±×·¡¹ÖÀ» óÀ½ ½ÃÀÛÇÏ½Å´Ù¸é ¼Á¡¿¡¼ ¾î¶°ÇÑ UNIX TCP/IP ÇÁ·Î±×·¡¹Ö ¼ÀûÀ» ±¸ÀÔÇϼŵµ ÈǸ¢ ÇÏ´Ù°í º¸ÁõÇÒ¼ö ÀÖ½À´Ï´Ù. ¸ðµç ¼ÀûÀÌ Àß ±âȹµÇ°í, ¸¸µé¾îÁ³½À´Ï´Ù. ±×·¡¼ Çϳª¸¦ ÃßõÇØ´Þ¶ó°í ºÎŹÇϸé Richard Stevens¾¾ÀÇ Ã¥À» ±ÇÇÕ´Ï´Ù. ´Ù¸¸ Çѱ۷Π¹ø¿ªµÈ ¾î¶°ÇÑ Richard StevensÀÇ Ã¥µµ ±¸ÀÔÇÏÁö ¸¶½Ã±â ¹Ù¶ø´Ï´Ù. ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ÄÄÇ»ÅÍ ¿ë¾îµéÀ» ¹«¸®ÇÏ°Ô ÇѱÛÈÇÏ´Â ¹Ù¶÷¿¡ Àдµ¥ ±èÄ¡ÇÏ¿ë¾î»çÀü(ÇöÀç ¼ºñ½º Á¦°øÁßÁö)À̶ó´Â ¹®¼ÀÇ µµ¿ò¾øÀÌ´Â ´Ü ÇÑÁÙµµ ÀÐÀ»¼ö ¾øÀ»°Ì´Ï´Ù. ÇѶ§ ¿ë¾î »çÀüÀÌ ÀÎÅͳݿ¡ Á¸ÀçÇߴµ¥ Áö±ÝÀº ¼ºñ½ºµÇÁö ¾Ê½À´Ï´Ù.
Ã¥ :
3.1. SUN Solaris¿¡¼ ÄÄÆÄÀÏÀº Á¦´ë·Î µÇ³ª ¸µÅ©½Ã ¿¡·¯°¡ ³³´Ï´Ù. ¶Linux¿¡¼´Â ±âº»ÀûÀ¸·Î ¸µÅ©ÇؾßÇÒ ¼ÒÄ϶óÀ̺귯¸®°¡ ±âº»ÀûÀ¸·Î ÀÖ´Â ¹Ý¸é¿¡ SUN Solaris¿¡¼´Â º°µµ·Î ¸µÅ©¸¦ ÇØÁÖ¾î¾ß¸¸ ÇÕ´Ï´Ù. ´ÙÀ½°ú °°Àº ¿É¼ÇÀ» ÁÖ¾î ¶óÀ̺귯¸®¸¦ ¸µÅ©ÇØÁֽñ⠹ٶø´Ï´Ù.
-lsocket -lnsl 3.1.1. ¼ÒÄÏÀÇ Á¢¼ÓÇØÁ¦´Â ¾î¶»°Ô ¾Ë¼ö°¡ ÀÖ½À´Ï±î.? ¶´ëºÎºÐÀÇ °æ¿ì recv()¿¡¼ ¹Ýȯ°ªÀÌ 0ÀÎ °æ¿ì¿¡´Â »ó´ëÆí¿¡¼ Á¢¼ÓÀ» ÇØÁ¦ÇÑ°ÍÀ¸·Î ÆÇ´ÜÇÏ½Ã¸é µË´Ï´Ù.
recv()°¡ ¹ÝȯÇÏ´Â °ªÀº
3.2. ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍ°¡ ´Ù¸£°Ô ³ªÅ¸³³´Ï´Ù. ¶µ¥ÀÌÅÍ ¼Û/¼ö½Å½Ã µ¥ÀÌÅÍ°¡ ´Ù¸£°Ô ³ªÅ¸³ª´Â ÀÌÀ¯´Â ¿©·¯°¡Áö·Î ÃßÃøÇغ¼¼ö Àִµ¥
ÀÌ°æ¿ì ¶Ç ÇÑ°¡Áö ÃßÃøÇغ¼¼ö Àִ°ÍÀº Àü¼ÛÇÏ´Â Ãø¿¡¼ 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" ¿¡·¯°¡ ¹ß»ýÇÑ ÇÕ´Ï´Ù. ¶´ëºÎºÐÀÇ °æ¿ì¿¡´Â ¼¹ö¸¦ ÁߴܽÃŲÈÄ¿¡ ¹Ù·Î Àç½ÃÀÛÀ» ÇßÀ»¶§ ±âÁ¸ÀÇ ÇÁ·Î±×·¥ ¼ÒÄÏÀÌ ¾ÆÁ÷µµ Á¡À¯ÇÏ°í »ç¿ëÇϱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â ¿¡·¯¸Þ½ÃÁöÀÔ´Ï´Ù.
ÀÌ°ÍÀº ¼µÎ¿¡ ¿ì¸®°¡ Á¤ÀÇ ÇßµíÀÌ 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 ¹æ½ÄÀÌ Ã¤Åõǰí ÀÖ½À´Ï´Ù.
4.1. select()´Â ¹«¾ùÀΰ¡¿ä.? ¶int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); SELECT()°¡ *nix ½Ã½ºÅÛ¿¡ žÀçµÈ ÀÌ·¡·Î ´Ù¾çÇÑ ºÐ¾ß¿¡ ¾²ÀÌ°í ÀÖ½À´Ï´Ù. °¡Àå ÀÚÁÖ ºó¹øÇÏ°Ô »ç¿ëÇÏ´Â ºÐ¾ß´Â
¶ÇÇÑ 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; }
4.3. select()°¡ ºí¶ô(Block) ´çÇÕ´Ï´Ù. ¶½ÇÁ¦ÀûÀ¸·Î select()°¡ ºí¶ô ´çÇÏ´Â°Í À̶ó±â º¸´Ù´Â I/O(read/write)ºÎºÐ¿¡¼ ±×·¯ÇÑ µ¿ÀÛÀÌ ÀϾ´Ï´Ù. ¿ø·¡ select()´Â Synchronous I/O MultiplexingÀ¸·Î µðÀÚÀÎ µÇ¾î Àֱ⠶§¹®¿¡ select()¸¸ ÀÌ¿ëÇØ ´ÙÁß ¼¹ö¸¦ ±¸¼ºÇÒ¶§¿¡´Â ÇÑÂÊ fd°¡ ºí¶ôµÇ¾î ÀÖÀ»¶§ ´Ù¸¥ÂÊ¿¡µµ ¿µÇâÀÌ °¡°Ô µË´Ï´Ù. µû¶ó¼ ÀÌ°ÍÀ» ÇØ°áÇÏ´Â ¹æ¹ýÀº
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 { /* Á¢¼Ó ¿¡·¯ */ }
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.1. HTTP ÇÁ·Î±×·¥Àº ¾î¶»°Ô ½ÃÀÛÇØ¾ß Çϳª¿ä.? ¶HTTP»Ó¸¸ ¾Æ´Ï¶ó FTP ÇÁ·Î±×·¥µµ RFC¸¦ ¸ÕÀú ÀÐ¾î º¸½Ã´Â°ÍÀÌ °¡Àå ºü¸¥±æÀÔ´Ï´Ù. ƯÈ÷¾Æ HTTP/1.0°ú HTTP/1.1ÀÌ ¸¹Àº Â÷À̸¦ º¸ÀÌ°í ÀÖÀ¸¹Ç·Î RFC¹®¼¸¦ ÇʼöÀûÀ¸·Î º¸¼Å¾ß¸¸ ÇÕ´Ï´Ù. ±×ÈÄ HTTP´Â ÀϹÝÀûÀÎ TCP/IP Åë½Å°ú °ÅÀÇ À¯»çÇϹǷΠƯº°È÷ ¹æ´ëÇÑ ¾çÀÇ ºê¶ó¿ìÀúÀÇ ¼Ò½º¸¦ È®ÀÎÇϽñ⠺¸´Ù´Â Á÷Á¢ ÄÚµùÀ» ÇϽô°͵µ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.
RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0
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 Åͳθµ¿¡´Â »ç¿ëÀÚ ÀÎÁõÀ̳ª Á¢¼ÓÀ¯Áöµî º¸¿ÏÇؾßÇÒ ¹®Á¦Á¡ÀÌ ¸¹ÀÌ µµ»ç¸®°í ÀÖÀ¸¹Ç·Î ÀÌ°Í ÀÚü°¡ ¸¸´ÉÀº ¾Æ´Õ´Ï´Ù. ¶ÇÇÑ ÁÖ¼Ò¹× Æ÷Æ®¸¦ Æ÷¿öµù ÇØÁÖ´Â °úÁ¤¿¡¼ »ý±â´Â ÆÐŶ ÀÚüÀÇ ¼Óµµ ÀúÇϸ¦ ¿°µÎ¿¡ µÎ¾î¾ß¸¸ ÇÕ´Ï´Ù.
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 |