제 12장 I/O멀티플렉싱(Multiplexing)

Slides:



Advertisements
Similar presentations
Tcl/Tk 민 인학 한국 Tcl/Tk 커뮤니티.
Advertisements

TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Chapter 09. 소켓 입출력 모델(I).
6 레이스 컨디션.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
13장 소켓.
제 8 장  파서 생성기 YACC 사용하기.
Linux System Programming
Department of Computer Engineering
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Signal & Inter-Process Communication
Department of Computer Engineering
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
6장. printf와 scanf 함수에 대한 고찰
Department of Computer Science and Engineering
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Linux System Programming
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
Department of Computer Engineering
데이터베이스 실험실 석사 2학기 김기훈 TCP/IP Socket Programming… 제 17장 멀티쓰레드 기반의 서버구현 데이터베이스 실험실 석사 2학기 김기훈
Department of Computer Engineering
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Department of Computer Engineering
21장. 문자와 문자열 처리 함수.
9장 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
Term Project Team Member
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
Advanced Socket Programming
(ioctl, mmap, fsync&flush)
6장 파일 및 레코드 잠금.
Department of Computer Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
Department of Computer Engineering
5 프로세스 정보.
13. 포인터와 배열! 함께 이해하기.
Signal & Inter-Process Communication
Chapter 09. 소켓 입출력 모델(I).
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 19장 윈도우 기반의 쓰레드 동기화 데이터베이스실험실 석사 2학기 조정희
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
파일 입출력.
Department of Computer Engineering
다중처리 기술 School of Electronics and Information. Kyung Hee University.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
argc, argv 의 사용방법 #include <stdio.h>
Department of Computer Engineering
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
3장 파일 다루기 한빛미디어(주).
배열.
Presentation transcript:

제 12장 I/O멀티플렉싱(Multiplexing) TCP/IP Socket Programming… 제 12장 I/O멀티플렉싱(Multiplexing) 시뮬레이션 실험실 박사 4학기 송수연

목차 멀티플렉싱 기반의 서버 Select 함수 사용하기 멀티플렉싱 서버의 구현 윈도우즈 기반으로 구현하기

I/O 멀티플렉싱 기반의 서버 멀티플렉싱? 데이터를 전송하는데 있어서, 물리적인 장치의 효율성을 높이기 위해 최소한의 물리적인 요소만 사용하여 최대한의 정보를 주고 받기 위해 개발된 방법 주파수 분할 방식 시 분할 방식

I/O 멀티플렉싱 기반의 서버 다중 접속 서버의 비교

Select 함수 사용하기 Select 함수의 기능과 호출 순서

Select 함수 사용하기 파일 디스크립터 설정하기 파일 디스크립터 범위설정하기 fd_set 자료형 데이터 조작함수 FD_ZERO(fd_set *fdset) ..*fdset의 모든 비트를 0으로. FD_SET(int fd, fd_set *fdset) ... *fdset 중 소켓 fd에 해당하는 비트를 1로. FD_CLR(int fd, fd_set *fdset) ... *fdset 중 소켓 fd에 해당하는 비트를 0으로. FD_ISSET(int fd, fd_set *fdset) ... *fdset 중 소켓 fd에 해당하는 비트가 1이고, 소켓에 I/O 변화가 생겼으면 true를 리턴 파일 디스크립터 범위설정하기 효율적인 슈행을 위해 확인해야하는파일 디스크립터의 범위를 제한해준다.

Select 함수 사용하기 타임 아웃(time out) 설정하기 timeout은 select() 호출할 때 얼마만큼(마이크로 단위)의 시간을 기다릴 것인지를 지정하는데 사용된다. timeout 구조체는 구조체 struct timeval의 자료형이며 에 다음과 같이 정의 되어 있다. ----------------------------------------------------------------------------------------- struct timeval { long tv_sec ; /* seconds */ long tv_user ; /* microseconds */ } -------------------------------------------------------------------------------------------

Select 함수 사용하기 SELECT 함수 호출 이후 결과 확인

Select 함수 사용하기 SELECT 함수 호출 예제 timeout.tv_usec = 100000; #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/time.h> #define BUFSIZE 30 Int main(int argc, char **argv) { fd_set reads, temps; int result; char message[ BUFSIZE ] int str_len; struct timeval timeout ; FD_ZERO(&reads); FD_SET(0, &reads); /* standard input 설정 /* timeout.tv_sec = 5; timeout.tv_usec = 100000; */ /* 이곳이 설정할 경우 문제 발생*/ while(1) { temps=reads; timeout.tv_sec=5; timeout.tv_usec=0; resullt=select(1, &temps, 0,0, &timeout); if(result==-1){ /*select 함수 오류 발생 */ puts(“select 오류 발생”); exit(1); } else if (result==0){ /* time-out에 의한 리턴 */ puts(“시간이 초과되었습니다 : select “); else { /* 파일 디스크립터 변화에 의한 리턴 */ if(FD_ISSET(0, &temps)) { str_len =read(0, message, BUFSIZE); message[str_len}=0; fputs(message, stdout); } /*while(1) end * /

Select 함수 사용하기 실행하기

멀티플렉싱 서버의 구현 echo_selserv.c if(fd_max<clnt_sock) fd_max=clnt_sock; printf( “ 클라이언트 연결 : 파일 디스크립터 &d \n”, clnt_sock); } else { str_len=read(fd, message, BUFSIZE); if(str_len==0){ /* 연결 종료 요청인 경우 */ FD_CLR(fd, &reads); close(fd); printf(“클라이언트 종료 : 파일 디스크립터 &d|n”, fd); else { write(fd, message, str_len); } //if (FD_ISSET(fd, &temps)) } //for (fd=0; fd<fd_max+1; fd++) } //while(1) Void error_handling(char *message) { fputs(message, stderr); fputc( ‘\n’, stderr0; exit(1); echo_selserv.c while(1) { int fd, str_len; int clnt_sock, clnt_addr temps=reads; timeout.tv_sec=5; timeout.tv_usec=0; if(select(fd_max+1,&temps, 0, 0, &timeout)==-1) error_handling( “select() error”); for(fd=0; fd<fd_max+1; fd++) if(FD_ISSET(fd, &temps)) if(fd==serv_sock) {/* 연결요청인 경우 */ clnt_len=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_ len); FD_SET(clnt_sock, &reaks);

멀티플렉싱 서버의 구현 실행 echo_selserv.c 실행하기 에코 클라이언트 실행하기

윈도우즈 기반으로 구현하기 SELECT함수의 원형 Timeout구조체 ----------------------------------------------------------------------------------------- struct timeval { long tv_sec ; // seconds long tv_user ; // and microseconds }; -------------------------------------------------------------------------------------------

윈도우 기반으로 구현하기 If(listen(hServsock, 5)==SOCKET_ERROR) ErrorHandling(“listen() error”); FD_ZERO(&reads); FD_SET(hServSock, &reads); While(1) { temps=reads; timeout.tv_sec=5; timeout.usec = 0; if(select(0, &temps, 0, 0, &timeout)==SOCKET_ERROR) ErrorHandlling(“select() error”); for(arrIndex=0; arrIndex<reads.fd_count; arrIndex++) if(FD_ISSET(reads.fd_array[arrIndex], &temps)) if(temps.fd_array[arrIndex]==hServSock) // 연결요청일경우. clntLen = sizeof (clntAddr); hClntSock = accept(hServSock, (SOCKADDR*)&clntaddr, &clntLen); FD_SET(hClntSock, &reads) ; printf( “클라이언트 연결:소켓핸들 %d \n”, hClntSock); } else //전된 데이터 존재하는경우.종료요청 혹은 데이터수신. straLen = recv(temps.fd_array[arrIndex], message, BUFSIZE-1, 0) ; if (strLen ==0) // 종료 요처의 경우. { FD_CLR(temps.fd_array[arrIndex], &reads); closesocket(temps.fd_array[arrIndex]); printf(“ 클라이언트 종료 : 소켓 핸들 %d\n” , temps.fd_array[arrIndex]); } else // 데이터 수신의 경우. send(temps.fd_array[arrIndex], message, strLen, 0); } //if(FD_ISSET(reads.fd_array(arrIndex], &temps)) end } //for(arrIndex=0; arrIndex<reads.fd_count; arrIndex++) end } //while(1) end WSACleanup(); return 0; Void ErrorHandling(chaar *message) { fputs(message, stderr); fputc( ‘\n’ , stderr) ; exit(1);

참고문헌 “UNIX Network Programming”, W.Richard Stevens “TCP/IP 소켓 프로그래밍”, 윤성우 저

Q & A