ㅇ 블로킹 / 넌블로킹 소켓으로 구분.
- 블로킹 소켓 :: 소켓 함수가 대기 상태로 기다림.
accept()
send() / sendto()
recv() / recvfrom()
- 넌블로킹 소켓 :: 소켓 함수가 대기하지 않고, 바로 진행
send , receive 등 에서 데이터가 송수신되지 않은 상태라면 오류가 발생했다는 값을 리턴시킨다.
그때 WSAGetLastError()를 사용하여 오류코드를 받아와 버퍼가 비어있는 이유 [ 강제종료인지, 버퍼가 비었는지 ] 를 알아본다.
( WSAGetLastError() :: 함수가 리턴되었을때 에러코드를 확인. )
오류 코드 - WSAEWOULDBLOCK :: 조건이 만족되지 않은 상태. = > " 나중에 함수를 다시 호출해줘야 함. "
:: 장점 ::
* 멀티스레드 없이 여러개의 소켓 입출력 가능.
* 블럭되지 않으므로, 다른 작업 수행이 가능.
:: 단점 ::
* 함수를 호출할때마다 오류코드를 확인하고, 다시 해당함수를 호출해야 함.
* CPU 사용률이 높음.
ㅇ 다양한 서버 작성 모델
- 반복 서버
One Thread 를 이용한 클라이언트 처리 방식. ( 들어온 순서대로... 순차적으로... )
* [장점] 시스템 자원 소모가 적음.
* [단점] 연결된 서버와 클라간 통신 시간이 길어지면 다른 클라이언트의 대기시간이 길어짐.
- 병행 서버
Multiple Thread 를 이용한 클라이언트 처리 방식
* [장점] 서버와 클라이언트 간에 연결로 인해 다른 클라이언트 접속에 영향을 주지 않음.
* [단점] 시스템 자원 소모가 큼.
ㅇ 이상적인 서버의 특징
- 서비스 요청에 최대한 빠르게 응답
- 시스템 자원 사용량 최소화
- 모든 클라이언트가 접속 가능
ㅇ 이상적인 소켓 입출력 모델
- 소켓 함수 블로킹 최소화
- 입출력 작업을 다른 작업과 병행
- 스레드 갯수 최소화
- 유저 모드와 커널 모드 전환 횟수와 데이터 복사 최소화. [ 불필요한 메모리접근 최소화 ]
[ 유저 = 응용프로그램. / App : Critical Section , O.S : Mutex, Event . . . ]
ㅇ Select 모델 :: 병행서버
- select() 함수가 핵심적인 역할을 함.
- 소켓 모드에 관계 없이, 여러개의 소켓을 스레드 하나로 처리 가능.
- 블로킹 소켓에서는 조건이 만족되지 않아 계속 대기 하야하는 상황을 방지.
Ex> 송신 버퍼에 데이터가 차 있어야 수신 버퍼에 데이터를 옮기도록 호출.
- 넌블로킹 소켓에서는 조건이 만족되지 않아, 다시 호출해야되는 상황을 방지
* 동작 원리
- 송신 버퍼와 수신 버퍼 ( + 예외 셋) 를 감시할 데이터 설정.
FD_SET을 이용하여 select() 함수 설정.
ㅇ소켓 셋을 다루기 위한 메크로 함수
- FD_CLR (socket s , fd_set* set); // 셋에 소켓 제거
- FD_ISSET(SOCKET s fd_set *set); // 셋에 소켓 s를 집어 넣음.
- FD_SET(SOCKET s,s fd_set *set); // 셋을 .
- FD_ZERO (fd_set *set) // 셋 전체 체거
p.346
반응형
반응형