ÇöÀç°­Á : UNIX ¼ÒÄÏ ÀÀ¿ë ÇÁ·Î±×·¡¹Ö ÀÌÀü 4.2 äÆà ¼­¹ö ÇÁ·Î±×·¥ ´ÙÀ½: 4.4 ¸ÖƼ¼­¹ö


4.3 äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥

4.3.1 ÇÁ·Î±×·¥ °³¿ä

¢º äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥(chat_client.c)Àº »ç¿ëÀÚÀÇ ÀÔ·Â ¸Þ½ÃÁö¸¦ ¼­¹ö·Î Àü¼ÛÇÏ°í, ¼­¹ö°¡ º¸³»¿Â ¸ðµç ¸Þ½ÃÁö¸¦ »ç¿ëÀÚ È­¸é¿¡ Ãâ·ÂÇÑ´Ù.

¢º Áï, 3.1ÀýÀÇ ÅäÅ© Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ talk_client.c¿Í À¯»çÇÑ µ¿ÀÛÀ» ÇÑ´Ù.

¢º ±×·¯³ª talk_client.c¿¡¼­´Â »ç¿ëÀÚÀÇ Å°º¸µå ÀԷ ó¸®¿Í ¼ö½Å ¸Þ½ÃÁö Ãâ·Â µÎ °¡Áö ÀÏÀ» µ¿½Ã¿¡ ¼öÇàÇϱâ À§Çؼ­ fork()¸¦ ÀÌ¿ëÇÏ¿© µÎ °³ÀÇ ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î °¢ ÇÁ·Î¼¼½º°¡ ÀÌ µÎ °¡Áö ÀÏÀ» ´ã´çÇÏ¿´À¸³ª, chat_client.c¿¡¼­´Â chat_server.c¿¡¼­¿Í °°ÀÌ select() ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇÏ¿© ¼ÒÄÏÀ» ºñµ¿±â ¸ðµå·Î ¹Ù²Ù¾î µÎ °¡Áö ÀÔÃâ·ÂÀ» ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼­ ó¸®Çϵµ·Ï ±¸ÇöÇÏ¿´´Ù.

¢º chat_client.c°¡ ¼öÇàµÇ±â À§ÇÏ¿©´Â 4.2Àý¿¡¼­ ¼³¸íÇÑ Ã¤Æà ¼­¹ö ÇÁ·Î±×·¥ chat_server.c°¡ ¼­¹ö¿¡¼­ ¸ÕÀú ½ÇÇàµÇ¾î¾ß Çϸç chat_server.c°¡ »ç¿ëÇÏ´Â Æ÷Æ®¹øÈ£¿Í ¼­¹öÀÇ IP ÁÖ¼Ò¸¦ Ŭ¶óÀ̾ðÆ®¿¡¼­ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.

¢º ¶ÇÇÑ Å¬¶óÀ̾ðÆ®¿¡¼­´Â äÆà Âü°¡ÀÚÀÇ À̸§À» ¸ðµç ¸Þ½ÃÁö ¾Õ¿¡ ºÙ¿©¼­ ¼­¹ö·Î Àü¼ÛÇÏ¿©¾ß Çϱ⠶§¹®¿¡ ÀÚ½ÅÀÇ À̸§À» ÇÁ·Î±×·¥ ½ÇÇà½Ã ÀÔ·ÂÇϵµ·Ï ÇÏ¿´´Ù.

chat_client server_IP server_Port my_name

¢ºÀ§¿¡¼­ server_IP´Â äÆà ¼­¹öÀÇ IP ÁÖ¼Ò (dotted deci- mal)ÀÌ°í server_Port´Â äÆà ¼­¹ö ÇÁ·Î±×·¥(chat_server .c) ½ÇÇà½Ã ÁöÁ¤ÇÑ Æ÷Æ®¹øÈ£À̸ç my_nameÀº äÆÿ¡¼­ »ç¿ëÇÒ ÀÚ½ÅÀÇ À̸§ÀÌ´Ù.

¢º ¾Æ·¡´Â chat_client.cÀÇ ½ÇÇà ¿¹ÀÌ´Ù.

# chat_client 203.252.65.3 4001 ö¼ö

Á¢¼Ó¿¡ ¼º°øÇß½À´Ï´Ù..

´ëÈ­¹æ¿¡ ¿À½Å°É ȯ¿µÇÕ´Ï´Ù...

4.3.2 ÇÁ·Î±×·¥ ÁÖ¿äºÎºÐ ¼³¸í

¢º chat_client.c¿¡¼­´Â ¸ÕÀú äÆà ¸Þ½ÃÁö ¾Õ¿¡ Ç×»ó ºÙ¿©¼­ Àü¼ÛÇÒ ÀÚ½ÅÀÇ À̸§(argv[3])À» ±¸Á¶Ã¼ Name¿¡ ±â·ÏÇØ µÐ´Ù.

struct Name {

char n[20]; /* äÆÿ¡¼­ »ç¿ëÇÒ À̸§*/

int len; /* À̸§ÀÇ ½ÇÁ¦ Å©±â */

} name;

/* Âü°¡ÀÚ À̸§À» Name ±¸Á¶Ã¼¿¡ ±â·Ï */

sprintf(name.n, "[%s]", argv[3]);

name.len = strlen(name.n);

¢º chat_client.c¿¡¼­ select()¸¦ È£ÃâÇÏ·Á¸é ¸ÕÀú fd_set ±¸Á¶Ã¼¸¦ ¸¸µé¾î¾ß Çϴµ¥ chat_client.c¿¡¼­´Â Àб⿡ ´ëÇÑ I/O¸¸ È®ÀÎÇÏ¸é µÇ¹Ç·Î fd_set ±¸Á¶Ã¼·Î read_fds Çϳª¸¸ ¼±¾ðÇÑ´Ù.

¢º FD_ZERO(&read_fds)¸¦ È£ÃâÇÏ¿© read_fdsÀÇ ¸ðµç ¼ÒÄϹøÈ£¸¦ disable½ÃŲ´Ù.

¢º ´ÙÀ½¿¡´Â I/O º¯È­¿¡ °ü½ÉÀ» °®´Â ¼ÒÄϹøÈ£(ÆÄÀϱâ¼úÀÚ)µéÀ» ¼¼Æ®ÇÏ¿©¾ß Çϴµ¥, chat_client.c¿¡¼­´Â Å°º¸µå ÀÔ·ÂÀ» À§ÇÑ ÆÄÀϱâ¼úÀÚ 0°ú ¼­¹ö¿Í Á¢¼ÓµÇ¾î ÀÖ´Â ¼ÒÄÏ s µÎ °³ÀÇ ÆÄÀϱâ¼úÀÚ°¡ ÀÖ´Ù.

¢º µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ FD_SET¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

fd_set read_fds; /* Àб⠺¯È­¸¦ °¨ÁöÇϱâ À§ÇÑ fd_set ±¸Á¶Ã¼ ¼±¾ð */

FD_ZERO(&read_fds) /* ÃʱâÈ­ */

FD_SET(0, &read_fds); /* Å°º¸µå ÀԷ¿ë ÆÄÀϱâ¼úÀÚ(0) ¼¼Æ® */

FD_SET(s, &read_fds); /* ¼­¹ö¿Í ¿¬°áµÈ ¼ÒÄϹøÈ£(s) ¼¼Æ® */

¢º select()¸¦ È£ÃâÇÒ ¶§, read_fds¸¦ select()ÀÇ µÎ¹ø° ÀÎÀÚ(Áï, Àб⠺¯È­ °¨Áö¿ë fd_set)·Î ÁöÁ¤ÇÏ°í, ¼¼¹ø°¿Í ³×¹ø° ÀÎÀÚ Áï, ¾²±â ¹× ¿¹¿Ü¹ß»ý¿¡ ÇØ´çÇÏ´Â fd_set´Â NULL·Î ÁöÁ¤ÇÑ´Ù.

¢º ÇÑÆí select() ¹®ÀÇ Ã¹¹ø° ÀÎÀÚ·Î »ç¿ëÇÒ 'ÃÖ´ë ¼ÒÄϹøÈ£ +1'ÀÇ °ªÀ¸·Î´Â s+1À» »ç¿ëÇÏ¿´´Ù.

select(nfds, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);

¢º select()°¡ ¸®ÅϵǾúÀ» ¶§, read_fds ³»ÀÇ ¼ÒÄϹøÈ£ s °ªÀÌ ¼¼Æ®µÇ¾î ÀÖ´Ù¸é ¼­¹ö¿¡¼­ ¸Þ½ÃÁö¸¦ º¸³»¿Â °ÍÀ̹ǷΠÀÌ ¸Þ½ÃÁö¸¦ Àоî È­¸é¿¡ Ãâ·ÂÇÑ´Ù.

¢º ÆÄÀϱâ¼úÀÚ 0ÀÌ ¼¼Æ®µÈ °æ¿ì´Â ÀÚ½ÅÀÇ Å°º¸µå ÀÔ·ÂÀÌ ¹ß»ýÇÑ °ÍÀ̹ǷΠÀÌ ¸Þ½ÃÁö¸¦ ¼­¹ö¿¡°Ô Àü¼ÛÇÏ¸é µÈ´Ù.

if (FD_ISSET(s, &read_fds)) /* ¼­¹ö°¡ º¸³»¿À´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ¿© Ãâ·Â */

if (FD_ISSET(0, &read_fds)) /* Å°º¸µå ÀÔ·Â µ¥ÀÌÅ͸¦ ¼­¹ö·Î Àü¼Û */

¢ºchat_client.c ÇÁ·Î±×·¥ ¸®½ºÆ®


ÇöÀç°­Á : UNIX ¼ÒÄÏ ÀÀ¿ë ÇÁ·Î±×·¡¹Ö ÀÌÀü 4.2 äÆà ¼­¹ö ÇÁ·Î±×·¥ ´ÙÀ½: 4.4 ¸ÖƼ¼­¹ö