본문 바로가기

Network Programing/Network 개념

소켓 모드 와 동기/비동기 란?

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함수를 설정하게 된다.


※ 넌블로킹과 비동기는 다른 개념이라는것을 확실히 넘어가자