- 프로세스의 생성을 동반하지 않고 다수의 클라이언트에게 서비스 제공하는 방법
- 멀티플렉싱 : 하나의 통신채널을 통해서 둘 이상의 데이터를 전송하는 데 사용되는 기술
물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만을 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술
- 멀티플렉싱을 적용 시킬 경우 서버는 접속한 클라 수에 상관없이 프로세스 하나만으로 연결이 가능
- 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 |