/* ----------------------------------------------------------------------------------------------------------- ÆÄÀϸí : multi_server.c ±â ´É : echo¿Í daytimeÀ» °°ÀÌ Á¦°øÇÏ´Â ¸ÖƼ¼­¹ö ÄÄÆÄÀÏ : cc -o multi_server multi_server.c -lsocket -lnsl ½ÇÇ࿹ : multi_server 3001 --------------------------------------------------------------------------------------------------------------*/ #include #include #include #include #include #include #include extern int errno; #define MAXLINE 1024 int main(int argc, char *argv[]) { int echo_fd, daytime_fd, s; /* ¼ÒÄϹøÈ£ */ int echo_port, daytime_port; /* Æ÷Æ®¹øÈ£ */ int nfds, len; fd_set read_fds; struct sockaddr_in server_addr, client_addr; /* ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */ if(argc != 2) { printf("½ÇÇà¹æ¹ý: %sÆ÷Æ®¹øÈ£\n", argv[0]); return -1; } echo_port = atoi(argv[1]); /* daytime ¼­ºñ½º Æ÷Æ®¹øÈ£¸¦ ÀÓÀÇ·Î ¹èÁ¤ */ daytime_port = echo_port + 1; /* echo ¼­ºñ½º¸¦ À§ÇÑ ¼ÒÄÏ »ý¼º */ echo_fd = socket(PF_INET, SOCK_STREAM, 0); bzero((char *)&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(echo_port); bind(echo_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); /* daytime ¼­ºñ½º¸¦ À§ÇÑ ¼ÒÄÏ »ý¼º */ daytime_fd = socket(PF_INET, SOCK_STREAM, 0); server_addr.sin_port = htons(daytime_port); bind(daytime_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)); listen(echo_fd, 5); listen(daytime_fd, 5); /*----------------------------------------- select() È£Ãâ ------------------------------------------*/ nfds = daytime_fd + 1; FD_ZERO(&read_fds); while(1) { FD_SET(echo_fd, &read_fds); FD_SET(daytime_fd, &read_fds); if(select(nfds, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)0) < 0) { printf("select error: %s\n", strerror(errno)); } /*---------------------------------------------------------------------------------------------------------- echo Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» ¿ä±¸ÇØ ¿Â °æ¿ì ---------------------------------------------------------------------------------------------------------*/ if(FD_ISSET(echo_fd, &read_fds)) { len = sizeof(client_addr); bzero((char *)&client_addr, len); s = accept(echo_fd, (struct sockaddr *)&client_addr, &len); echo_process(s); close(s); } /*----------------------------------------------------------------------------------------------------------- daytime Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» ¿ä±¸ÇØ ¿Â °æ¿ì ---------------------------------------------------------------------------------------------------------*/ if(FD_ISSET(daytime_fd, &read_fds)) { len = sizeof(client_addr); s = accept(daytime_fd, (struct sockaddr *)&client_addr, &len); daytime_process(s); close(s); } } } /*---------------------------------------------------------------------------------------------------------------- echo ¼­ºñ½º ó¸® ÇÔ¼ö Á¤ÀÇ -----------------------------------------------------------------------------------------------------------------*/ int echo_process(int echo_fd) { int len; char buf[MAXLINE]; while((len = read(echo_fd, buf, sizeof(buf))) != 0) { if (len < 0) { printf("echo: read error - %s\n", strerror(errno)); return -1; } if(write(echo_fd, buf, len) < 0) { printf("echo: write error - %s\n", strerror(errno)); return -1; } } return 0; } /*---------------------------------------------------------------------------------------------------------------- daytime ¼­ºñ½º ó¸® ÇÔ¼ö ----------------------------------------------------------------------------------------------------------------*/ int daytime_process(int daytime_fd) { time_t now; char buf[MAXLINE]; time(&now); sprintf(buf, "%s\n", ctime(&now)); if(write(daytime_fd, buf, strlen(buf)) < 0) { printf("daytime: write error - %s\n", strerror(errno)); return -1; } return 0; }