ÇöÀç°Á : 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 ¸ÖƼ¼¹ö