ÇöÀç°Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.3 Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼ºÀýÂ÷ ´ÙÀ½: 2.5 ¼ÒÄÏ °ü·Ã UNIX ½Ã½ºÅÛ ÄÝ
2.4 ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷
¢º º» Àý¿¡¼´Â echo ±â´ÉÀ» °®´Â ¼¹ö ÇÁ·Î±×·¥ myecho_ server.c¸¦ ±¸ÃàÇØ º»´Ù.
2.4.1 ¿¬°áÇü ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷
¢º ±×¸² 2-11¿¡ TCP(¿¬°áÇü) ¼¹ö¸¦ iterative ÇüÅ Áï, ¼ºñ½º ¿ä±¸°¡ µé¾î¿À´Â ¼ø¼´ë·Î ó¸®ÇØ ÁÖ´Â ÇüÅ·Π±¸ÃàÇÏ´Â ÀýÂ÷¸¦ ³ªÅ¸³Â´Ù.
¢º ¼¹ö´Â socket()À¸·Î ¼ÒÄÏÀ» °³¼³ÇÏ°í bind()¸¦ ¼öÇàÇÑ ÈÄ listen()À¸·Î ¼ÒÄÏÀ» ¼öµ¿ ´ë±â¸ðµå·Î ¸¸µç´Ù.
¢º ´ÙÀ½¿¡´Â accept()¸¦ È£ÃâÇÏ¿© Àڽſ¡°Ô ¿¬°áÀ» ¿äûÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» ó¸®Çϵµ·Ï ÇÑ´Ù.
¢º Ŭ¶óÀ̾ðÆ®¿Í ¿¬°áµÈ ÈÄ¿¡´Â Ŭ¶óÀ̾ðÆ®°¡ ¿ä±¸ÇÏ´Â ¿äû(request)À» ó¸®ÇÏ°í °á°ú(response)¸¦ Àü¼ÛÇØ ÁÖ´Â ¹æ½ÄÀ¸·Î ¼ºñ½º¸¦ ó¸®ÇÏ°í ÇϳªÀÇ ¼ºñ½º¸¦ ¿Ï·áÇÏ¸é ´ÙÀ½ ¿äûÀ» ó¸®ÇÑ´Ù.
±×¸² 2-11 Iterative ¸ðµ¨ÀÇ TCP(¿¬°áÇü) ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷
(1) socket(), ¼ÒÄÏÀÇ »ý¼º
¢º ¼¹ö ÇÁ·Î±×·¥µµ Ŭ¶óÀ̾ðÆ®¿Í ¸¶Âù°¡Áö·Î Åë½ÅÀ» Çϱâ À§ÇÏ¿©´Â Æ®·£½ºÆ÷Æ® ÇÁ·ÎÅäÄÝÀ» ÁöÁ¤ÇÏ¿© ¼ÒÄÏÀ» ¸¸µé¾î¾ß Çϴµ¥ À̸¦ À§ÇØ socket() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
¢º socket()ÀÇ »ç¿ë ¹æ¹ýÀº Ŭ¶óÀ̾ðÆ®ÀÇ °æ¿ì¿Í °°À¸¸ç myecho_ server.c¿¡¼µµ ¿¬°áÇü ¼ÒÄÏÀ» »ç¿ëÇϹǷΠÇÁ·ÎÅäÄÝ Ã¼°è·Î SOCK_STREAMÀ» ÁöÁ¤ÇÑ´Ù.
socket(PF_INET, SOCK_STREAM, 0);
¡¡
(2) bind(), ¼ÒÄϹøÈ£¿Í ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ ¿¬°á
¢ºsocket() ½Ã½ºÅÛ ÄÝÀ» ÅëÇؼ »ý¼ºµÈ ¼ÒÄÏÀº ±× ÀÀ¿ë ÇÁ·Î±×·¥³»¿¡¼ À¯ÀÏÇÑ ¹øÈ£ÀÎ ¼ÒÄϹøÈ£¸¦ Çϳª ¹èÁ¤¹Þ´Â´Ù.
¢º ±×·¯³ª ÀÌ ¹øÈ£´Â ÀÀ¿ë ÇÁ·Î±×·¥¸¸ ¾Ë°í »ç¿ëÇÏ´Â ¹øÈ£À̹ǷΠÀÌ ÇÁ·Î±×·¥ÀÌ ÄÄÇ»ÅÍ ¿ÜºÎ¿Í Åë½ÅÇÏ·Á¸é ÀÌ ¼ÒÄϹøÈ£¿Í TCP/IP ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â ¼ÒÄÏÁÖ¼Ò(IP ÁÖ¼Ò + Æ÷Æ®¹øÈ£)¸¦ ¿¬°áÇØ µÎ¾î¾ß Çϸç À̸¦ À§ÇÏ¿© bind()¸¦ »ç¿ëÇÑ´Ù.
¢º ±×¸² 2-12¿¡ bind() È£Ãâ½ÃÀÇ IP ÁÖ¼Ò, Æ÷Æ®¹øÈ£, ±×¸®°í ¼ÒÄϹøÈ£ÀÇ °ü°è¸¦ ³ªÅ¸³Â´Ù.
¢º bind()´Â ÀÀ¿ë ÇÁ·Î±×·¥ ÀÚ½ÅÀÇ(local) ÁÖ¼Ò¿Í ¼ÒÄϹøÈ£¸¦ ¿¬°áÇÏ´Â ÀÛ¾÷À̶ó°í ÇÒ ¼ö ÀÖ´Ù.
¢º ¼¹ö¿¡¼ bind()°¡ ¹Ýµå½Ã ÇÊ¿äÇÑ ÀÌÀ¯´Â ÀÓÀÇÀÇ Å¬¶óÀ̾ðÆ®°¡ ¼¹öÀÇ Æ¯Á¤ ÇÁ·Î±×·¥ÀÌ ¸¸µç ¼ÒÄÏ°ú Åë½ÅÀ» ÇÏ·Á¸é ±× ¼ÒÄÏÀ» ãÀ» ¼ö ÀÖ¾î¾ß Çϸç, µû¶ó¼ ¼¹ö´Â ¼ÒÄϹøÈ£¿Í Ŭ¶óÀ̾ðÆ®°¡ ¾Ë°í ÀÖÀ» ¼¹öÀÇ IP ÁÖ¼Ò ¹× Æ÷Æ®¹øÈ£(Áï, ¼¹öÀÇ ¼ÒÄÏÁÖ¼Ò)¸¦ ¹Ì¸® ¼·Î ¿¬°á(bind)½ÃÄÑ µÎ´Â °ÍÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù.
±×¸² 2-12 bind() È£Ãâ½Ã ¼ÒÄÏ ¹øÈ£¿Í ¼ÒÄÏ ÁÖ¼ÒÀÇ °ü°è
¢º ¾Æ·¡´Â bind() ½Ã½ºÅÛ ÄÝÀÇ »ç¿ë ¹®¹ýÀ̸ç bind()´Â ¼º°øÇϸé 0À», ½ÇÆÐÇϸé -1À» ¸®ÅÏÇÑ´Ù.
¢º ÀÎÀÚ s´Â bind½Ãų ¼ÒÄϹøÈ£·Î¼ socket() ½Ã½ºÅÛ ÄÝÀÌ ¸®ÅÏÇÑ °ÍÀ̸ç *addrÀº ¼ÒÄÏÁÖ¼Ò¸¦ ´ã°í ÀÖ´Â ±¸Á¶Ã¼ÀÌ´Ù.
int bind ( int s, /* ¼ÒÄϹøÈ£ */ struct sockaddr *addr, /* ¼¹ö ÀÚ½ÅÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ Æ÷ÀÎÅÍ */ int len); /* *addr ±¸Á¶Ã¼ÀÇ Å©±â */ |
¢º ¾Æ·¡ÀÇ ÇÁ·Î±×·¥ ÄÚµå´Â ¼ÒÄÏÀ» ¸¸µé°í ÀÌ°ÍÀ» IP ÁÖ¼Ò°¡ 203.252.65.3ÀÌ°í Æ÷Æ®¹øÈ£°¡ 3000¹øÀÎ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¿Í bind()ÇÏ´Â °ÍÀ» º¸¿´´Ù.
¢º¾Æ·¡¿¡¼ inet_addr()Àº ¹®ÀÚ¿·Î µÈ dotted decimal IP ÁÖ¼Ò 203.252.65.3¸¦ 4¹ÙÀÌÆ® IP ÁÖ¼Ò 1010111 10110010 00101101 00000011·Î ¹Ù²Ù´Â ÇÔ¼öÀ̸ç(2.2.3Àý ÂüÁ¶), htons()´Â È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼ÀÇ ¼ýÀÚ 3000¹øÀ» ³×Æ®¿÷ ¹ÙÀÌÆ® ¼ø¼·Î ¹Ù²Ù±â À§ÇÏ¿© »ç¿ëµÇ¾ú´Ù.
#define SERV_IP_ADDR "203.252.65.3" #define SERV_PORT 3000
/* ¼ÒÄÏ »ý¼º */
s = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
/* ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ ³»¿ë */
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERV_IP_ADDR);
server_addr.sin_port = htons(SERV_PORT);
/* ¼ÒÄϹøÈ£¿Í ¼ÒÄÏÁÖ¼Ò¸¦ bind */
bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr));
¢º ¾ÕÀÇ bind()¹®¿¡¼ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ ³ªÅ¸³»´Â ÇÔ¼ö ÀÎÀÚ·Î server_addrÀ» ¹Ù·Î »ç¿ëÇÏÁö ¾Ê°í(struct sockaddr*) &server_addrÀ» »ç¿ëÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
¢º ´ëºÎºÐÀÇ ÀÎÅÍ³Ý ¼ÒÄÏ ÇÁ·Î±×·¥¿¡¼´Â ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ Æí¸®ÇÏ°Ô ´Ù·ç±â À§ÇÏ¿©(Áï, IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£¸¦ Á÷Á¢ ±â·ÏÇϰųª ÀÐÀ» ¼ö ÀÖµµ·Ï) sockaddr_in ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.
¢º bind() ÇÔ¼ö¸¦ ºñ·ÔÇÑ °¢Á¾ ¼ÒÄÏ ÇÔ¼öÀÇ Á¤ÀÇ¿¡¼´Â ÀϹÝÀûÀÎ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÎ sockaddr¸¦ »ç¿ëÇϵµ·Ï Á¤ÀǵǾî Àֱ⠶§¹®¿¡ ±¸Á¶Ã¼ ŸÀÔÀ» ¹Ù²Ù´Â castingÀÌ ÇÊ¿äÇÑ °ÍÀÌ´Ù.
¢º À§¿¡¼ ÀÚ½ÅÀÇ IP ÁÖ¼Ò·Î 203.252.65.3À» ±¸Ã¼ÀûÀ¸·Î ÁöÁ¤ÇÏ¿´´Ù.
¢º ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¼öÇàµÇ´Â ÄÄÇ»ÅÍ ÀÚ½ÅÀÇ IP ÁÖ¼Ò¸¦ ÀÚµ¿À¸·Î °¡Á®´Ù ¾²·Á¸é INADDR_ANY¶ó´Â º¯¼ö¸¦ ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µÈ´Ù.
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); |
¡¡
¢º À§¿¡¼´Â Æ÷Æ®¹øÈ£·Î 3000¹øÀ» ÁöÁ¤ÇÏ¿© »ç¿ëÇÏ¿´Áö¸¸, Æ÷Æ®¹øÈ£¸¦ 0À¸·Î ÇÏ°í bind()¸¦ È£ÃâÇÏ¸é ½Ã½ºÅÛ(Áï, TCP/IP)ÀÌ Æ÷Æ®¹øÈ£¸¦ ÀÚµ¿À¸·Î ¹èÁ¤ÇØ ÁØ´Ù.
¢º ´ÙÀ½Àº ÀÌ°ÍÀ» È®ÀÎÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥ test_bind.cÀε¥ ¼ÒÄÏÀ» µÎ °³ °³¼³ÇÏ°í °¢°¢ Æ÷Æ®¹øÈ£¸¦ 0À¸·Î ÇÏ¿© bind()¸¦ È£ÃâÇÑ ÈÄ ½Ã½ºÅÛÀÌ ¹èÁ¤ÇÑ Æ÷Æ®¹øÈ£¸¦ ȸ鿡 Ãâ·ÂÇÏ°í ÀÖ´Ù.
/*-----------------------------------------------------------------------------
ÆÄÀϸí : test_bind.c ±â ´É : ½Ã½ºÅÛÀÌ ÀÚµ¿À¸·Î ¹èÁ¤ÇÑ Æ÷Æ®¹øÈ£¸¦ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ ÄÄÆÄÀÏ : cc -o test_bind test_bind.c -lsocket -lnsl ½ÇÇ࿹ : test_bind ---------------------------------------------------------------------------- */ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <limits.h> #define ADDRESS "192.203.144.11" #define PORT 7 #define MSG "Test Message" int main() { int sd1, sd2 ; /* ¼ÒÄϹøÈ£ */ struct sockaddr_in sin1, sin2 ; /* ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */ int addr_len ; /* ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ Å©±â */ u_short rtn1, rtn2; /* Æ÷Æ®¹øÈ£
*/ /* TCP¿Í UDP µÎ°¡Áö ¼ÒÄÏ »ý¼º */ sd1 = socket(AF_INET, SOCK_STREAM, 0) ; sd2 = socket(AF_INET, SOCK_DGRAM, 0) ; sin1.sin_family = PF_INET ; sin1.sin_addr.s_addr = inet_addr(ADDRESS) ; sin1.sin_port = htons(PORT) ; if(connect(sd1, (struct sockaddr*)&sin1, sizeof(sin1))<0) { printf("Error : Connect
failed!!!\n") ; exit(1) ; } addr_len = sizeof(sin2); if (getsockname(sd1, (struct sockaddr*)&sin2, &addr_len) < 0){ printf("getsockname error\n"); } rtn1 = sin2.sin_port ; if(sendto(sd2, MSG, strlen(MSG), 0, (struct sockaddr*)&sin1, sizeof(sin1))<0) { printf("Error : sendto failed!!\n") ; exit(1) ; } addr_len = sizeof(sin2); if(getsockname(sd2, (struct sockaddr*)&sin2, &addr_len)<0) printf("Error : getsockname error\n") ; rtn2 = sin2.sin_port ; /* ¹èÁ¤µÈ Æ÷Æ®¹øÈ£ Ãâ·Â */ printf("stream socket's bind return = %d\n", rtn1 ) ; printf("datagram socket's bind
return = %d\n", rtn2) ; close(sd1) ; close(sd2) ; } |
¢º ¼¹ö¿¡¼ socket()°ú bind()¸¦ È£ÃâÇÏ¿© Åë½ÅÀ» ÇÒ Áغñ°¡ µÈ ÈÄ, µ¥ÀÌÅ͸¦ ¼Û¼ö½ÅÇÏ´Â ÀýÂ÷´Â ¼ÒÄÏ °³¼³½Ã ÁöÁ¤ÇÑ Æ®·£½ºÆ÷Æ® ÇÁ·ÎÅäÄÝÀÇ Á¾·ù¿¡ µû¶ó ´Ù¸£´Ù.
¢º ¿¬°áÇü Åë½Å(TCP)¿¡¼´Â listen(), accept()ÀÇ È£ÃâÀÌ ÇÊ¿äÇÏ°í ºñ¿¬°áÇü Åë½Å(UDP)¿¡¼´Â ¹Ù·Î µ¥ÀÌÅÍÀÇ ¼Û¼ö½ÅÀÌ °¡´ÉÇÏ´Ù.
¢º ¿ì¼± ¿¬°áÇü ¼¹öÀÇ °æ¿ì¿¡ ´ëÇÏ¿© ¼³¸íÇÏ°Ú´Ù.
(3) listen(), Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍÀÇ ¿¬°á¿äûÀ» ±â´Ù¸®±â
¢º ¼¹ö´Â Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍÀÇ ¿¬°á¿äûÀ» ¹Þ¾ÆµéÀ̱â À§ÇÏ¿© À̸¦ ±â´Ù¸®°í ÀÖ¾î¾ß Çϴµ¥ À̸¦ À§ÇÏ¿© listen()À» È£ÃâÇϸç listen()ÀÇ »ç¿ë¹®¹ýÀº ¾Æ·¡¿Í °°´Ù.
¡¡
int listen ( int s, /* ¼ÒÄϹøÈ£ */ int log); /* ¿¬°áÀ» ±â´Ù¸®´Â Ŭ¶óÀ̾ðÆ®ÀÇ ÃÖ´ë ¼ö */ |
¢º À§¿¡¼ ÀÎÀÚ log´Â ¼¹ö¿¡¼ (´ÙÀ½¿¡ ¼³¸íÇÒ) accept()¸¦ ó¸®ÇÏ´Â µ¿¾È ´ë±â½Ãų ¼ö ÀÖ´Â connect()ÀÇ ¿äû ¼ö¸¦ ÁöÁ¤ÇÑ´Ù. Áï, Ŭ¶óÀ̾ðÆ®°¡ ¿ä±¸ÇÑ ¿¬°á¿äûÀ» ÃÖ´ë log°³±îÁö ±â´Ù¸®°Ô ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
¢º ¿¹¸¦µé¾î ¾Æ·¡ÀÇ ÄÚµå´Â ¼¹ö°¡ ÃÖ´ë 2°³ÀÇ connect() ¿äûÀ» ´ë±â½Ãų ¼ö ÀÖÀ¸¸ç, ¼¼ ¹ø° ÀÌÈÄÀÇ connect() ¿äûÀº °ÅÀýÇÏ¿© Ŭ¶óÀ̾ðÆ®°¡ ÀÌ »ç½ÇÀ» ¹Ù·Î ¾Ë ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
listen(s, 2); |
¢º ÇÑÆí listen()Àº ¼ÒÄÏÀ» ´ÜÁö ¼öµ¿ ´ë±â¸ðµå·Î ¹Ù²Ù´Â °ÍÀ̹ǷΠlisten()ÀÇ È£ÃâÀº Áï½Ã ¸®ÅϵǴµ¥ ¼º°ø½Ã¿¡´Â 0, ½ÇÆнÿ¡´Â -1ÀÌ ¸®ÅϵȴÙ.
(4) accept(), Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍÀÇ ¿¬°á¿äû ¼ö¶ô
¢º ¼¹ö°¡ listen()À» È£ÃâÇÑ ÀÌÈÄ¿¡ ¾î¶² Ŭ¶óÀ̾ðÆ®¿¡¼ connect()·Î ÀÌ ¼¹ö¿¡ ¿¬°á¿äûÀ» º¸³»¿À¸é À̸¦ ó¸®Çϱâ À§ÇØ ¼¹ö´Â accept()¸¦ È£ÃâÇØ µÎ¾î¾ß ÇÑ´Ù.
¢º accept()ÀÇ ¼öÇàÀÌ ¼º°øÇÑ °æ¿ì¿¡´Â Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®¿ÍÀÇ ÀÏ ´ë ÀÏ Åë½Å¿¡ »ç¿ëÇÒ »õ·Î¿î ¼ÒÄÏÀÌ ¸¸µé¾îÁö°í accept()´Â ÀÌ ¼ÒÄϹøÈ£¸¦ ¸®ÅÏÇÏ¸ç ½ÇÆнÿ¡´Â -1À» ¸®ÅÏÇÑ´Ù.
¢º accept()´Â ¶ÇÇÑ Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¿Í ±¸Á¶Ã¼ÀÇ ±æÀÌÀÇ Æ÷ÀÎÅ͸¦ ÇÔ¼öÀÎÀÚ addr°ú addrlenÀ¸·Î °¢°¢ ¸®ÅÏÇÑ´Ù.
¢º accept()ÀÇ »ç¿ë ¹®¹ýÀº ¾Æ·¡¿Í °°°í accept() È£Ãâ½Ã¿¡ ¾ò´Â °ªµéÀ» ±×¸² 2-13¿¡ ³ªÅ¸³Â´Ù.
int accept ( int s, /* ¼ÒÄϹøÈ£ */ struct sockaddr *addr, /* ¿¬°á¿äûÀ» ÇÑ »ó´ë¹æÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */ int *addrlen); /* *addr ±¸Á¶Ã¼ Å©±âÀÇ Æ÷ÀÎÅÍ */ |
¡¡
±×¸²2-13 accept() È£Ãâ½Ã ¾ò´Â ¼ÒÄÏ ÁÖ¼Ò Á¤º¸¿Í »õ·Î¿î ¼ÒÄÏ
(5) close(), ¼ÒÄÏ Á¾·á
¢º ¼ÒÄÏÀ» ´ÝÀ» ¶§ close()¸¦ È£ÃâÇϴµ¥ µ¥ÀÌÅͱ׷¥(UDP) ¼ÒÄÏ¿¡¼ close()¸¦ È£ÃâÇÏ¸é ´Ü¼øÈ÷ »ç¿ëÇÏ´ø ¼ÒÄÏÀ» ´Ý´Â ÀÛ¾÷¸¸ ¼öÇàÇÑ´Ù.
¢º ±×·¯³ª ½ºÆ®¸²(TCP)¼ÒÄÏÀº ¿¬°áÇü ¼ºñ½ºÀ̹ǷΠÇöÀç ¹Ìó¸®µÈ ÆÐŶµé(¼Û½Å ¹öÆÛ¿¡ ÀÖÀ¸³ª ¾ÆÁ÷ ¼Û½ÅÀÌ ¾È µÈ ÆÐŶ ¶Ç´Â ÇöÀç ¼Û¼ö½ÅÁß¿¡ ÀÖ´Â ÆÐŶ)À» ¸ðµÎ ó¸®ÇÑ ÈÄ¿¡ ¼ÒÄÏÀ» ´Ý°Ô µÈ´Ù.
¢º ±×·¯³ª ÀÌ·¯ÇÑ ¹Ìó¸® ÆÐŶÀ» Áï½Ã ¸ðµÎ ¹ö¸®°Ô Çϰųª, ÁöÁ¤ÇÑ ½Ã°£µ¿¾È 󸮵DZ⸦ ±â´Ù¸± ¼ö Àִµ¥ À̸¦ À§ÇÏ¿©´Â setsockopt() ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇÑ´Ù(ÀÚ¼¼ÇÑ ³»¿ëÀº 5.2.1Àý ÂüÁ¶).
2.4.2 ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼º ¿¹
¢º ¿©±â¼´Â echo ¼ºñ½º¸¦ Á¦°øÇÏ´Â ¼¹ö ÇÁ·Î±×·¥ myecho_ server.c¸¦ ¼Ò°³ÇÑ´Ù.
¢º myecho_server.c´Â Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¿äûÀ» ¼ö¶ôÇÑ ÈÄ À̸¦ ´Ü¸»±â¿¡ Ç¥½ÃÇÑ ´ÙÀ½ echo ¼ºñ½º¸¦ ÇÑ ¹ø ¼öÇàÇÑ´Ù.
¢º myecho_server.cÀÇ ½ÇÇà°á°ú´Â ´ÙÀ½°ú °°´Ù.
# myecho_server 2049
Server : waiting connection request. Server : client connected. Server : waiting connection request. |
¢º ¿¹¸¦µé¾î Æ÷Æ®¹øÈ£ 2049¸¦ ÁöÁ¤ÇÏ¿© myecho_server.c¸¦ ¼¹ö¿¡¼ ½ÇÇàÇÑ ÈÄ ¾î¶² Ŭ¶óÀ̾ðÆ®¿¡¼ ÀÌ ¼¹ö·Î Á¢¼ÓÀ» ÇÏ·Á¸é Æ÷Æ®¹øÈ£¸¦ 2049·Î ÇÏ¿© Á¢¼ÓÀ» ¿ä±¸ÇÏ¿©¾ß ÇÑ´Ù.
¢º ÀÌ·¯ÇÑ Å¬¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº 2.3.4ÀýÀÇ myecho.c¿¡¼ ¼¹öÀÇ Æ÷Æ®¹øÈ£¸¦ 2049·Î ÇÏ¿© »ç¿ëÇÏ¸é µÈ´Ù.
¢º myecho_server.c ÇÁ·Î±×·¥Àº µÎ °³ÀÇ ¼ÒÄϹøÈ£¸¦ ÇÊ¿ä·Î Çϴµ¥ Çϳª(server_fd)´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á¿äûÀ» ±â´Ù¸®±â À§ÇØ »ç¿ëµÇ°í ´Ù¸¥ Çϳª(client_fd)´Â Ŭ¶óÀ̾ðÆ®¿Í µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ±â À§ÇØ »ç¿ëµÈ´Ù.
¢º ¼¹ö´Â accept() ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏ¿© Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¿äûÀ» ±â´Ù¸®´Âµ¥ ÇÁ·Î±×·¥ÀÇ ÁøÇàÀº accept() ½Ã½ºÅÛ ÄÝ¿¡¼ ¸ØÃß°Ô µÈ´Ù. ÀÌ ¶§ ¾î¶² Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¿äûÀÌ ¼ö½ÅµÇ¸é accept()´Â »õ·Î¿î ¼ÒÄÏ(client_fd)À» »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù.
¢º accept()´Â ¶ÇÇÑ µÎ¹ø° ÀÎÀÚ·Î ÁöÁ¤µÈ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ client_addr¿¡, Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò Á¤º¸¸¦ ±â·ÏÇÏ¿© ¸®ÅÏÇÑ´Ù.
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, int &len); |
¡¡
¢º ¼¹ö´Â Ŭ¶óÀ̾ðÆ®°¡ º¸³»¿À´Â ¸Þ½ÃÁö¸¦ read()·Î Àаí write()·Î echoÇØ ÁØ ´ÙÀ½ ¼ÒÄÏ client_fd¸¦ ´Ý´Â´Ù.
¢º myecho_server.c ÇÁ·Î±×·¥ ¸®½ºÆ®
ÇöÀç°Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.3 Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼ºÀýÂ÷ ´ÙÀ½: 2.5 ¼ÒÄÏ °ü·Ã UNIX ½Ã½ºÅÛ ÄÝ