프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당 코드 설명 실행 compute node file dump 각 데이터 별, I/O node 별 file dump PPT 파일 제출
프로젝트 점수(1) 미 구현 프로그램 오류 5 data size 줄임 10 1번(20점) 프로그램 오류 5 data size 줄임 10 1번(20점) compute node file 내용오류(크기는 맞음) 256KB I/O node file 내용오류(크기는 맞음) 각 -2점 128KB I/O node file 내용오류(크기는 맞음) 64KB I/O node file 내용오류(크기는 맞음)
프로젝트 점수(2) 미 구현 프로그램 오류 10 data size 줄임 20 2번(40점) 프로그램 오류 10 data size 줄임 20 2번(40점) compute node file 내용오류(크기는 맞음) 256KB I/O node file 내용오류(크기는 맞음) 각 -5점 128KB I/O node file 내용오류(크기는 맞음) 64KB I/O node file 내용오류(크기는 맞음)
프로젝트 점수(3) 미 구현 프로그램 오류 10 data size 줄임 20 3번(40점) 프로그램 오류 10 data size 줄임 20 3번(40점) compute node file 내용오류(크기는 맞음) 256KB I/O node file 내용오류(크기는 맞음) 각 -5점 128KB I/O node file 내용오류(크기는 맞음) 64KB I/O node file 내용오류(크기는 맞음)
[예제 11-7] (1) 인터넷 소켓(서버)-server1.c ... 09 #define PORTNUM 9000 10 11 int main(void) { 12 char buf[256]; 13 struct sockaddr_in sin, cli; 14 int sd, ns, clientlen = sizeof(cli); 15 16 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(PORTNUM); 24 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 25 26 if (bind(sd, (struct sockaddr *)&sin, sizeof(sin))) { 27 perror("bind"); 28 exit(1); 29 } 포트번호 소켓 생성 소켓 주소 구조체 생성 소켓기술자와 소켓 주소 구조체 연결
[예제 11-7] (1) 인터넷 소켓(서버) 31 if (listen(sd, 5)) { 32 perror("listen"); 33 exit(1); 34 } 35 36 if ((ns = accept(sd, (struct sockaddr *)&cli, &clientlen))==-1){ 37 perror("accept"); exit(1); 39 } 40 41 sprintf(buf, "Your IP address is %s", inet_ntoa(cli.sin_addr)); 42 if (send(ns, buf, strlen(buf) + 1, 0) == -1) { 43 perror("send"); 44 exit(1); 45 } 46 close(ns); 47 close(sd); 48 49 return 0; 50 } 클라이언트 접속요청 대기 클라이언트와 연결 클라이언트로 데이터 보내기
[예제 11-7] (2) 인터넷 소켓(클라이언트)-client1.c ... 09 #define PORTNUM 9000 10 11 int main(void) { 12 int sd; 13 char buf[256]; 14 struct sockaddr_in sin; 15 16 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(PORTNUM); 24 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 25 포트번호 소켓 생성 소켓 주소 구조체 생성
[예제 11-7] (2) 인터넷 소켓(클라이언트) 26 if (connect(sd, (struct sockaddr *)&sin, sizeof(sin))) { 27 perror("connect"); 28 exit(1); 29 } 30 31 if (recv(sd, buf, sizeof(buf), 0) == -1) { 32 perror("recv"); 33 exit(1); 34 } 35 close(sd); 36 printf("From Server : %s\n", buf); 37 38 return 0; 39 } 서버에 접속 요청 서버가 보낸 데이터 읽기 # gcc -o ex11_7s ex11_7-inet-s.c -lsocket -lnsl # gcc -o ex11_7c ex11_7-inet-c.c -lsocket -lnsl # ex11_7s.out 서버 # ex11_7c.out From Server : Your IP address is 192.168.162.131 클라이언트
TCP 기반 프로그래밍 반복서버 동시동작서버 데몬 프로세스가 직접 모든 클라이언트의 요청을 차례로 처리 데몬 프로세스가 직접 서비스를 제공하지 않고, 서비스와 관련있는 다른 프로세스를 fork 함수로 생성해 클라이언트와 연결시켜준다.
[예제 12-1] (1) 반복서버(서버)-server2.c ... 10 #define PORTNUM 9001 11 12 int main(void) { 13 char buf[256]; 14 struct sockaddr_in sin, cli; 15 int sd, ns, clientlen = sizeof(cli); 16 17 memset((char *)&sin, '\0', sizeof(sin)); 18 sin.sin_family = AF_INET; 19 sin.sin_port = htons(PORTNUM); 20 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 21 22 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 23 perror("socket"); 24 exit(1); 25 } 26 27 if (bind(sd, (struct sockaddr *)&sin, sizeof(sin))) { 28 perror("bind"); 29 exit(1); 30 } 31 32 if (listen(sd, 5)) { 33 perror("listen"); 34 exit(1); 35 } 소켓 주소구조체 생성 소켓 생성 클라이언트 접속 대기
[예제 12-1] (1) 반복서버(서버) 37 while (1) { 38 if ((ns = accept(sd, (struct sockaddr *)&cli, &clientlen)) == -1) { 39 perror("accept"); 40 exit(1); 41 } 42 sprintf(buf, "%s", inet_ntoa(cli.sin_addr)); 43 printf("*** Send a Message to Client(%s)\n", buf); 44 45 strcpy(buf, "Welcome to Network Server!!!"); 46 if (send(ns, buf, strlen(buf) + 1, 0) == -1) { 47 perror("send"); 48 exit(1); 49 } 50 51 if (recv(ns, buf, strlen(buf), 0) == -1) { 52 perror("recv"); 53 exit(1); 54 } 55 printf("** From Client : %s\n", buf); 56 close(ns); 57 } 58 close(sd); 59 60 return 0; 61 } 클라이언트 접속 클라이언트에 정보전송 클라이언트의 데이터 수신
[예제 12-1] (2) 반복서버(클라이언트)-client2.c ... 11 #define PORTNUM 9001 12 13 int main(void) { 14 int sd; 15 char buf[256]; 16 struct sockaddr_in sin; 17 18 memset((char *)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; 20 sin.sin_port = htons(PORTNUM); 21 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 22 23 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 24 perror("socket"); 25 exit(1); 26 } 27 28 if (connect(sd, (struct sockaddr *)&sin, sizeof(sin))) { 29 perror("connect"); 30 exit(1); 31 } 소켓 주소구조체 생성 소켓 생성 서버에 연결 요청
[예제 12-1] (2) 반복서버(클라이언트) 33 if (recv(sd, buf, sizeof(buf), 0) == -1) { 34 perror("recv"); 35 exit(1); 36 } 37 38 printf("** From Server : %s\n", buf); 39 40 strcpy(buf, "I want a HTTP Service."); 41 if (send(sd, buf, sizeof(buf) + 1, 0) == -1) { 42 perror("send"); 43 exit(1); 44 } 45 46 close(sd); 47 48 return 0; 49 } 서버의 데이터 수신 서버에 데이터 송신 # ex12_1s.out 서버 # ex12_1c.out ** From Server : Welcome to Network Server!!! 클라이언트 # ex12_1s.out *** Send a Message to Client(192.168.162.133) ** From Client : I want a HTTP Service. 서버 # ex12_1s.out *** Send a Message to Client(192.168.162.131) ** From Client : I want a FTP Service. 클라이언트
[예제 12-2] (1) 동시 동작 서버(서버)-server3.c ... 10 #define PORTNUM 9002 11 12 int main(void) { 13 char buf[256]; 14 struct sockaddr_in sin, cli; 15 int sd, ns, clientlen = sizeof(cli); 16 17 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 18 perror("socket"); 19 exit(1); 20 } 21 22 memset((char *)&sin, '\0', sizeof(sin)); 23 sin.sin_family = AF_INET; sin.sin_port = htons(PORTNUM); 25 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 26 27 if (bind(sd, (struct sockaddr *)&sin, sizeof(sin))) { 28 perror("bind"); 29 exit(1); 30 } 31 32 if (listen(sd, 5)) { 33 perror("listen"); 34 exit(1); 35 }
[예제 12-2] (1) 동시 동작 서버(서버) 37 while (1) { 38 if ((ns = accept(sd, (struct sockaddr *)&cli, &clientlen)) == -1) { 39 perror("accept"); 40 exit(1); 41 } 42 switch (fork()) { 43 case 0: 44 close(sd); 45 strcpy(buf, "Welcome to Server"); 46 if (send(ns, buf, strlen(buf) + 1, 0) == -1) { 47 perror("send"); 48 exit(1); 49 } 50 51 if (recv(ns, buf, strlen(buf), 0) == -1) { 52 perror("recv"); 53 exit(1); 54 } 55 printf("** From Client: %s\n", buf); 56 sleep(5); 57 exit(0); 58 } 59 close(ns); 60 } 61 62 return 0; 63 } fork로 자식 프로세스 생성 자식 프로세스가 클라이언트로 메시지 보내고 데이터 수신
실습 클라이언트에서 보낸 메시지를 그대로 되돌려주는 에코서버와 클라이언 트를 작성하라. 클라이언트 메시지가 quit를 보내면 프로그램은 종료한다 . 반복서버 동시동작서버 유닉스 도메인 소켓