TODAY : / TOTAL :

소켓 모드 [ Socket Mode ]

  • Share this:
반응형

ㅇ 블로킹 / 넌블로킹 소켓으로 구분.

- 블로킹 소켓 :: 소켓 함수가 대기 상태로 기다림.
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

반응형

SEARCH

태그로 찾아보기