본문 바로가기

네트워크/네트워크이론

[네트워크] 소켓의 동작모드

소켓의 동작 모드
Blocking
- 소캣을 처음 생성했을 때 Default모드
- 이 소켓에 대해 어떤 시스템 콜을 호출하였을 떄 네트워크 시스템 ( 즉, TCP/IP )이 동작을 완료할 때까지
  그 시스템 콜에서 프로세스가 멈추어 있게 한다.
- Block이 될 수 있는 소켓 시스템 콜은 Listen(), Connect(), Accept(), Recv(), Send(), Read(), Write(),
   Recvfrom(), Sendto(), Close()등이 있다.
- 1:1 통신을 하거나 프로그램이 한 가지 작업만 하면 되는 경우는 Blocking 모드로 프로그램을 작성할 수 있다.

Non-Blocking
- 소켓 관련 시스템 콜에 대하여 네트워크 시스템이 즉시 처리할 수 없는 경우라도 시스템 콜이 바로 리턴되어
  응용 프로그램이 Block되지 않게 하는 소켓
- 통신 상대가 여럿이거나 여러 가지 작업을 병행하려면 Non-Blocking이나 비동기 모드를 사용해야 한다.
- Non-Blocking 모드를 사용하는 경우에는 일반적으로 어떤 시스템 콜이 성공적으로 실행될 때까지 계속 Roop를
  돌면서 확인하는 방법 ( 폴링 )을 사용한다.
- 유닉스에서는 fcntl() 시스템 콜을 사용하여 소켓을 Non-Blocking 모드로 변환 할 수 있다.

Asynchronous ( 비동기 )
- 소켓의 어떤 I/O 변화가 발생하면 ( 데이터의 도착 등) 그 사실을 응용 프로그램이 알 수 있도록 하여 그 때 원하는
  동작을 할 수 있게 하는 모드
- 전화에서 상대방과 통화 할 수 없을 때 전화를 걸어 달라고 부탁하고 끊는 것과 유사
- 소켓을 비동기 모드로 바꾸는 방법
     1. select() 함수 이용 - I/O 변화가 발생 할 수 있는 소켓 전체를 대상으로 select()문을 호출해 두면 
       그 중 임의의 소켓에서 I/O 변화가 일어났을 때 select()문이 리턴되고, 이때 원하는 작업을 하는 방법
     2, fcntl()을 사용하여 소켓을 Signal-Driven I/O 모드로 바꾸는 방법 - 특정소켓에서 I/O 변화가 발생하였을 때 
       그 소켓이 SIGIO 시그널을 발생시키도록 하고 응용 프로그램에서는 이 시그널을 받으면 필요한 작업을 하는 방법