본문 바로가기
programing/Networks

IO 멀티플렉싱 기반 서버

by RedWiz 2015. 5. 15.

 

Multiplexing.zip

 

 

- 프로세스의 생성을 동반하지 않고 다수의 클라이언트에게 서비스 제공하는 방법

 

- 멀티플렉싱 : 하나의 통신채널을 통해서 둘 이상의 데이터를 전송하는 데 사용되는 기술

물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만을 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술

 

- 멀티플렉싱을 적용 시킬 경우 서버는 접속한 클라 수에 상관없이 프로세스 하나만으로 연결이 가능

 

- select()

> 한 곳에 여러 개의 파일 디스크립터를 모아놓고 동시에 관찰 가능 (파일 디스크립터 관찰 = 소켓 관찰)

-> 수신한 데이터를 지니고 있는 소켓 존재?

-> 블로킹 되지 않고 전송 가능한 소켓은 무엇?

-> 예외상황이 발생한 소켓은 무엇?

cf. 관찰 항목 각각을 event 라 함

 

int select(

int nfds,                                // 파일 디스크립터 수

fd_set *readfds,                     // 수신된 데이터의 존재 여부에 관심 있는 파일 디스크립터 모음

fd_set *writefds,                     // 블로킹 없는 전송 가능 여부에 관심 있는 파일 디스크립터 모음

fd_set *excepfds,                   // 예외상황의 발생여부에 관심 있는 파일 디스크립터  모음

const struct timeval* timeout    // select 함수 호출 이후 블로킹 상태에 빠지지 않기 위한 타임 아웃

);    // 성공 시 0 이상, 실패 시 -1

 

typedef struct timval

{

long tv_sec;      // 초 단위

long tv_usec;    // 마이크로 초 단위

} TIMEVAL;

 

typedef struct fd_set

{

u_int fd_count;                              // 저장된 소켓 핸들 수

SOCKET fd_array[FD_SETSIZE];    // 저장된 소켓 핸들

} FD_SET;

  

> fd_set형 변수 관련 함수

->FD_ZERO(fd_set* fdset)            : 파일 디스크립터 배열을 0으로 초기화

->FD_SET(SOCKET fd, fd_set* fdset)      : 배열에 파일 디스크립터 등록

->FD_CLR(SOCKETfd, fd_set* fdset)       : 배열에 파일 디스크립터 삭제

->FD_ISSET(SOCKET fd, fd_set* fdset)    : 해당 파일 디스크립터가 있으면 양수 반환

 

 

'programing > Networks' 카테고리의 다른 글

멀티 캐스트& 브로드 캐스트  (0) 2015.05.18
입출력 함수  (0) 2015.05.18
Half-close, DNS, 소켓 옵션  (0) 2015.05.15
UDP 기반 서버 / 클라  (0) 2015.05.14
TCP 기반 서버 / 클라  (0) 2015.05.13