Select 함수
제일 먼저 등장한 입출력 다중화 모델.
예전에는 하나의 포트당 프로그램을 하나씩 동작하여 처리함. 하나의 프로세스에서 여러개의 디바이스 처리를 위해 등장
블록킹 소켓 사용 효과
- 소켓 함수 호출시, 조건 만족이 되지 않아서 블록되는 상황을 막는다.
넌블록킹 소켓 사용 효과
- 조건이 만족되지 않아서, 나중에 다시 호출하지 않아도 된다.
Select 동작
1 | Select 모델을 사용하려면 소켓 셋 3개를 준비한다. |
IO완료를 통지받지 않고, Event Loop을 통해 소켓 상태를 검사하므로 동기식 입출력
타임아웃을 설정한 경우, 넘어가므로 논블록킹 소켓
장점
- 모든 OS에서 지원하므로 이식성이 좋다.
단점
- 스레드당 처리가능한 소켓의 갯수가 정해져 있다. ( FD_SETSIZE로 처리가능한 수를 늘릴수 있음)
- 하위 호환성을 위해 존재한다. 소켓 입출력 모델중 가장 느리다. (소켓 상태를 다 검사해야된다.)
Example
1 | ```cpp |
ASyncSelect
- 소켓 함수 호출시 성공할수 있는 시점을 윈도우 메세지 수신으로 알수있다.
멀티스레드를 사용하지 않아도, 여러개의 소켓 처리가 가능(멀티스레드가 쓰기가 애매해진다.)
윈도우 메세지를 통해, 비동기적으로 소켓활용 가능
- 장점
- 소켓 이벤트를 윈도우 메세지 형태로 처리하므로, GUI와 결합이 가능.
단점
- 하나의 윈도우 프로시저에서 일반 윈도우 메세지와 소켓 메세지를 처리해야하므로, 성능저하의 원인이 된다.
- 윈도우 큐 메세지에는 한도가 있다. 같이 쓰다보니, 오버플로우 될수 있다.
- 멀티스레드를 쓰기 힘든 구조
유의할점
- WSAASyncSelect을 사용하면 해당 소켓은 자동으로 넌블럭킹 소켓
- accpet 함수가 리턴하는 소켓은 연결대기 소켓과 동일한 속성을 갖게된다.
- 연결대기 소켓은 데이터송수신 하지않으므로, FD_READ, FD_WIRTE를 처리하지 않는다.
- 다시 WSAASyncSelect 호출하여 이벤트를 등록해야된다.
- 윈도우메세지를 받았을때, 소켓함수를 호출하지않으면, 다음번에는 윈도우메세지가 발생하지않는다.
- 대응함수를 호출하거나, 직접 메세지를 발생시켜야 된다.
Example
1 | WinMain() |