ÇöÀç°Á : UNIX ¼ÒÄÏ ÀÀ¿ë ÇÁ·Î±×·¡¹Ö ÀÌÀü 4.3 äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ´ÙÀ½: 4.5 ¼ÒÄÏ ÇÔ¼ö 󸮽ð£ ÃøÁ¤
4.4 ¸ÖƼ¼¹ö
¢º ¸ÖƼ¼¹ö¶õ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼ µÎ °¡Áö ÀÌ»óÀÇ ¼ºñ½º¸¦ µ¿½Ã¿¡ Á¦°øÇϰųª, µ¿ÀÏÇÑ ¼ºñ½º¸¦ µÎ°¡Áö ÀÌ»óÀÇ ÇÁ·ÎÅäÄÝ(Áï, TCP¿Í UDP)·Î Á¦°øÇÏ´Â ¼¹ö¸¦ ¸»ÇÑ´Ù.
¢º ¸ÖƼ¼¹öÀÇ ÀåÁ¡Àº ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¼ºñ½º¸¦ Á¦°øÇÏ´Â °Í¿¡ ºñÇØ ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» Àû°Ô »ç¿ëÇÏ¸é¼ µ¿ÀÏÇÑ ¼ºñ½º¸¦ Á¦°øÇÑ´Ù´Â °ÍÀÌ´Ù.
¢º º» Àý¿¡¼´Â TCP¸¦ ÅëÇØ µÎ °³ÀÇ ¼ºñ½º echo¿Í daytimeÀ» Á¦°øÇÏ´Â ¸ÖƼ¼¹ö ÇÁ·Î±×·¥À» ÀÛ¼ºÇϸç, µÎ °¡Áö ¼ºñ½º¿¡ ´ëÇÑ ¿äûÀ» ±¸ºÐÇϱâ À§ÇØ select() ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÑ´Ù.
4.4.1 ÇÁ·Î±×·¥ °³¿ä
¢º º» Àý¿¡¼ ¼Ò°³ÇÒ ¸ÖƼ¼¹ö ÇÁ·Î±×·¥ multi_server.c¿¡¼´Â µÎ °¡Áö ¼ºñ½º echo¿Í daytime¸¦ Á¦°øÇϱâ À§ÇÏ¿© µÎ °³ÀÇ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù.
¢º Áï, echo ¼ºñ½º´Â ¼ÒÄϹøÈ£ echo_fd¸¦, daytime ¼ºñ½º´Â ¼ÒÄϹøÈ£ daytime_fd¸¦ ¾Æ·¡¿Í °°ÀÌ ¸¸µé¾î »ç¿ëÇÑ´Ù.
/* echo ¼ºñ½º¸¦
À§ÇÑ ¼ÒÄÏ »ý¼º */ echo_fd = socket(PF_INET, SOCK_STREAM, 0); /* daytime ¼ºñ½º¸¦ À§ÇÑ ¼ÒÄÏ »ý¼º */ daytime_fd = socket(PF_INET, SOCK_STREAM, 0); |
¢º ¼ÒÄÏÀ» »ý¼ºÇÑ ´ÙÀ½ ¹«ÇÑ·çÇÁ¸¦ µ¹¸ç Ŭ¶óÀ̾ðÆ®ÀÇ ¼ºñ½º ¿ä±¸¸¦ ±â´Ù¸°´Ù.
¢º FD_SET ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿© ¼ÒÄÏ echo_fd¿Í daytime_fd¸¦ fd_set ŸÀÔÀÇ ±¸Á¶Ã¼ read_fds¿¡ ÁöÁ¤Çϸç ÇâÈÄ¿¡ ÀÌ ¼ÒÄÏ¿¡¼ Àб⠺¯È°¡ ¹ß»ýÇϸé select() ¹®ÀÌ ¸®Åϵǵµ·Ï ÇÑ´Ù.
¢º ÇÁ·Î±×·¥Àº echo_fd ¶Ç´Â daytime_fd°¡ Àб⠰¡´ÉÇÑ »óÅ°¡ µÉ ¶§±îÁö select() ¹®¿¡¼ ±â´Ù¸°´Ù.
while(1) { FD_SET(echo_fd, &read_fds); FD_SET(daytime_fd, &read_fds); select(nfds, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)0); } |
¢º select() ¹®ÀÌ ¸®ÅϵǾúÀ» ¶§ ¾î¶² ¼ºñ½º ¿ä±¸°¡ ¹ß»ýÇÏ¿´´ÂÁö¸¦ ±¸ºÐÇϱâ À§ÇÏ¿© FD_ISSET ¸ÅÅ©·Î¸¦ »ç¿ëÇÑ´Ù.
¢º FD_ISSET´Â read_fds ±¸Á¶Ã¼¿¡¼ ÇØ´ç ¼ÒÄÏÀÌ ¼¼Æ®µÇ¾î ÀÖÀ¸¸é ¾ç¼ö°ªÀÎ ¼ÒÄϹøÈ£¸¦ ¸®ÅÏÇÑ´Ù.
/* echo Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÀ» ¿ä±¸ÇØ
¿Â °æ¿ì
*/ if(FD_ISSET(echo_fd, &read_fds)) echo_process(s); /* echo ¼ºñ½º
¼öÇà */
/* daytime Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÀ» ¿ä±¸ÇØ ¿Â °æ¿ì */ if(FD_ISSET(daytime_fd, &read_fds)) daytime_process(s); /* daytime ¼ºñ½º ¼öÇà */ |
¢º echo_process()´Â echo¸¦ ó¸®Çϵµ·Ï ¸ÖƼ¼¹ö¿¡¼ ±¸ÇöÇÑ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö·Î¼ ¼ÒÄϹøÈ£ echo_fd¸¦ ÇÔ¼ö ÀÎÀÚ·Î ¹ÞÀ¸¸ç ¼ÒÄÏÀ» ÅëÇØ ÀÔ·ÂµÈ ¹®ÀÚ¿À» ±× ¼ÒÄÏÀ¸·Î ±×´ë·Î Ãâ·ÂÇÑ´Ù.
¢º ¾Æ·¡´Â echo_process() ±¸Çö ºÎºÐÀÌ´Ù.
int echo_process(int
echo_fd) { while((len = read(echo_fd, buf, sizeof(buf))) != 0) write(echo_fd, buf, len); return 0; } |
¢º daytime_process()´Â ¼ÒÄϹøÈ£ daytime_fd¸¦ ÀÎÀÚ·Î ¹ÞÀ¸¸ç, time() ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ½Ã½ºÅÛÀÇ ÇöÀç ½Ã°¢À» ¾ò´Â´Ù.
¢ºctime() ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ¾Æ·¡¿Í °°Àº ÇüÅÂÀÇ ½Ã°¢À» ³ªÅ¸³»´Â ¹®ÀÚ¿·Î º¯°æÇÑ ÈÄ ÀÌ ¹®ÀÚ¿À» Ŭ¶óÀ̾ðÆ®·Î Àü¼ÛÇÑ´Ù (time()¿¡ °üÇÏ¿©´Â 4.5Àý¿¡¼ ´Ù½Ã ¼³¸íÇÑ´Ù).
Wed May 21 12:45:35 1997 |
¡¡
¢º ¾Æ·¡´Â daytime_process() ±¸Çö ºÎºÐÀÌ´Ù.
int
daytime_process(int daytime_fd) { time(&now); sprintf(buf, "%s\n", ctime(&now)); write(daytime_fd, buf, strlen(buf)); return 0; } |
¢º multi_server.c ÇÁ·Î±×·¥ ¸®½ºÆ®
ÇöÀç°Á : UNIX ¼ÒÄÏ ÀÀ¿ë ÇÁ·Î±×·¡¹Ö ÀÌÀü 4.3 äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ´ÙÀ½: 4.5 ¼ÒÄÏ ÇÔ¼ö 󸮽ð£ ÃøÁ¤