1. 소켓 모드
1.1 블로킹 소켓(blocking)
- 소켓 함수 호출 시 조건이 만족 되지 않으면 함수는 리턴하지 않고 해당 스레드는 대기 상태이다.
- 소켓 함수는 리턴하지 않으면 멀티스레드를 사용하여 다른 작업을 하지 않는 한 어플리케이션이 더 는 진행 할수 없다.
- Socket() 함수는 기본적으로 블로킹 소켓이다.
1.2 넌 블로킹 소켓(Non-blocking)
- 소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 해당 스레드는 계속 진행 할 수 있다.
- ioctlsocket()함수를 호출해야만 넌블로킹 소켓으로 바꿀수 있다.
- 넌 블로킹 소켓은 WSAEWOULDBLOCK으로 항시 체크하여 다시 소켓 함수를 호출하여야 한다.
※ listen_sock이 넌블로킹이면 client_sock도 넌블로킹 소켓이 된다.
- 넌블로킹 소켓의 특징
ㆍ 장점 : 소켓 함수 호출 시 블록되지 않으므로 다른 작업을 진행 할 수 있다.
멀티스레드를 사용하지 않고 여러 개의 입출력을 처리 할 수 있다.
ㆍ 단점 : WSAEWOULDBLOCK등 오류코드를 확인하고 다시 함수를 호출해야 하므로 프로그램 구조가 복잡해진다.
블로킹 소켓을 사용한 경우보다 CPU 사용률이 높다.
2. 블로킹 소켓과 넌 블로킹 소켓 정리
- 블로킹과 넌 블로킹의 가장 차이점은 파일디스크립터 고나련 함수에서 기다리느냐 마느냐가 차이
- 넌 블로킹은 Read에 읽을 데이터가 없을 시 에러(-1)을 Return를 하게 되며 errono.h의 errno를 확인 하며 EWOULDBOCK일 경우 적절한 처리를 해주어야만 하기 때문에 프로그램이 복잡해진다.
- 하지만 에러처리를 잘하면 어떠한 빈틈도 없는 프로그램이 될 수 있다.
3. 동기와 비동기
3.1 동기(Syncronous)
- 동기화 와 블로킹은 차이점이 거의 없다.
- 동기화 하기 위해서 봉쇄(Blocking)을 한다.
3.2 비동기(Asyncronous)
- 비동기는 Read함수를 호출하면 바로 Return이 된다.
- 그리고 작업이 완료될 떄 알려줄 수 있는 Event나 Callback함수를 설정하게 된다.
※ 넌블로킹과 비동기는 다른 개념이라는것을 확실히 넘어가자
'Network Programing > Network 개념' 카테고리의 다른 글
소켓 입출력 모델 - 2. WSAAsyncSelect 모델 (0) | 2016.09.11 |
---|---|
소켓 입출력 모델 - 1.Select 모델 (0) | 2016.09.11 |
쓰레드 동기화 기법 (0) | 2016.09.10 |
동기(Sync) 와 비동기(ASync) (0) | 2016.09.01 |
Nagle알고리즘 이란? (0) | 2015.12.24 |