ÇöÀç°­Á : 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 ¼ÒÄÏ ÇÔ¼ö 󸮽ð£ ÃøÁ¤