ÇöÀç°­Á : 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 ½Ã½ºÅÛ ÄÝ