본문 바로가기

통신 관련 지식/네트워크(Network)

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

* 소켓 동작 모드

 

* 블로킹 모드 (Blocking Mode)

- 소캣을 처음 생성했을 때 Default모드

- 이 소켓에 대해 어떤 시스템 콜을 호출하였을 떄 네트워크 시스템 ( 즉, TCP/IP )이 동작을 완료할 때까지 그 시스템 콜에서 프로세스가 멈추어 있게 한다.

- Block이 될 수 있는 소켓 시스템 콜은 Listen(), Connect(), Accept(), Recv(), Send(), Read(), Write(), Recvfrom(), Sendto(), Close()등이 있다.

- 1:1 통신을 하거나 프로그램이 한 가지 작업만 하면 되는 경우는 Blocking 모드로 프로그램을 작성할 수 있다.

 

* 논블로킹 모드 (Non-Blocking Mode)

- 소켓 관련 시스템 콜에 대하여 네트워크 시스템이 즉시 처리할 수 없는 경우라도 시스템 콜이 바로 리턴되어 응용 프로그램이 Block되지 않게 하는 소켓

- 통신 상대가 여럿이거나 여러 가지 작업을 병행하려면 Non-Blocking이나 비동기 모드를 사용해야 한다.

- Non-Blocking 모드를 사용하는 경우에는 일반적으로 어떤 시스템 콜이 성공적으로 실행될 때까지 계속 Roop를 돌면서 확인하는 방법 ( 폴링 )을 사용한다.

- 유닉스에서는 fcntl() 시스템 콜을 사용하여 소켓을 Non-Blocking 모드로 변환 할 수 있다.

 

* 비동기 모드(Asynchronous Mode)

- 소켓의 어떤 I/O 변화가 발생하면 ( 데이터의 도착 등) 그 사실을 응용 프로그램이 알 수 있도록 하여 그 때 원하는 동작을 할 수 있게 하는 모드

- 전화에서 상대방과 통화 할 수 없을 때 전화를 걸어 달라고 부탁하고 끊는 것과 유사

- 소켓을 비동기 모드로 바꾸는 방법

1. select() 함수 이용 - I/O 변화가 발생 할 수 있는 소켓 전체를 대상으로 select()문을 호출해 두면 그 중 임의의 소켓에서 I/O 변화가 일어났을 때 select()문이 리턴되고, 이때 원하는 작업을 하는 방법

2. fcntl()을 사용하여 소켓을 Signal-Driven I/O 모드로 바꾸는 방법 - 특정소켓에서 I/O 변화가 발생하였을 때 그 소켓이 SIGIO 시그널을 발생시키도록 하고 응용 프로그램에서는 이 시그널을 받으면 필요한 작업을 하는 방법