Q&A

  • Non-blocking socket 과 blocking socket의 차이점?
Non-blocking socket 과 blocking socket의 차이점은
뭘까요?? ^^:
2  COMMENTS
  • Profile
    Crazy 2004.06.02 23:18
    출처 : 인터넷 ㅡ.ㅡ

    1-2. 윈속의 동작모드


    BSD 소켓과 마찬가지로 윈속이 제공하는 소켓도 다음과 같은 세 가지 동작모드 (operating mode)를 가지고 있다.

    Blocking 모드, Non-blocking 모드, Asynchronous(비동기) 모드 각각에 대하 알아보자


    1-2-1. Blocking 모드


    socket() 시스템 콜을 호출하여 하나의 소켓을 만들면 이것은 디폴트로 blocking 모드로 동작하는 소켓이 된다. 이러한 blocking 모드의 소켓을 대상으로 accept(), closesocket(), connect(), recv(), recvfrom(), send(), sendto()와 같은 함수를 호출하면 함수가 원하는 동작을 완료할 때까지 함수를 호출한 프로세스가 blocking될 수 있다.

    즉, blocking 모드의 소켓에서는 응용 프로그램에서 위와 같은 함수를 호출하였을 때 그 동작이 완료되어 함수가 리턴 되어야 다음 작업을 할 수 있게 된다.

    한편 멀티태스킹이 지원되는 UNIX 컴퓨터에서는 blocking 모드의 소켓을 사용하여 어떤 응용 프로그램이 블록 되어도 컴퓨터 전체 동작에는 큰 문제가 되지 않는다. 왜냐하면 멀티태스킹 운영체제에서는 각각의 프로세스들이 독립적으로 수행되므로 한 프로세스가 블록 되어 있어도 다른 프로세스들은 계속 수행될 수 있기 때문이다.

    그러나 윈도우3.1과 같은 단일 태스킹 운영체제에서는 프로그램이 한 곳에 블록 되어 있으면 PC 전체가 블록 될 수 있다. 또한 blocking 모드의 소켓을 사용하면 하나의 프로그램에서 여러 개의 소켓을 동시에 개설하여 각각의 입출력을 처리하는 형태의 응용 프로그램을 작성하기가 어렵다.

    따라서 윈속 프로그래밍에서는 이를 해결하기 위하여 소켓을 non-blocking 모드 또는 비동기 모드로 변경하여 사용하는 것이 필요하다.


              1-2-2. Non-blocking 모드

    Non-blocking 모드 소켓이란 accept(), closesocket(), connect(), recv(), recvfrom(), send(), sendto()와 같은 함수가 호출되었을 때 함수의 원하는 동작이 완료되는 것과 무관하게 일단 함수가 즉시 리턴 되는 소켓을 말한다.

    소켓이 처음 만들어지면 디폴트로 blocking 모드가 되는데 프로그래머는 필요에 따라 blocking 모드의 소켓을 non-blocking 모드로 바꿀 수 있다.

    Non-blocking 모드의 소켓을 사용하는 이유는 응용 프로그램이 이곳에서 멈추어 있지(block) 않게 하기 위해서이다. Non-blcoking 모드의 소켓에서 함수 호출이 즉시 리턴 되었

    을 때 그 결과는 다음과 같이 두 가지로 종류로 나눌 수 있다.


    1) 성공적인 리턴: 함수의 동작이 즉시 성공적으로 수행되었음.

    2) 에러 리턴 : 함수 수행 중 에러가 발생했거나 함수가 블록 되었음.


    즉, non-blocking 모드 소켓에서 즉시 리턴 된 함수 호출 결과는 성공적인 경우도 있고 실패한 경우도 있을 수 있다. 에러 리턴인 경우 에러코드가 WSAEWOULDBLOCK이면, 이것의 의미는 함수의 동작이 잘못되었다는 것이 아니라 '이 함수가 동작 완료될 때까지 기다린다면 block될 수 있다'는 것을 의미한다.

    이와 같이 에러코드가 WSAEWOULDBLOCK인 경우 그 원인은 다음의 두 가지 중 하나가 된다.


    1) Winsock.dll이 함수가 원하는 동작을 시작했으나 아직 종료되지 않았음.

    2) 함수의 동작이 시작되지 못했으며 다시 재 시도를 필요로 함.


    위의 첫 번째 경우는 응용 프로그램이 함수의 동작 완료 시점을 알아서 그 결과를 처리하여야 하며 두 번째 경우는 응용 프로그램이 이 함수가 성공적으로 시작될 때까지 함수를 계속 반복하여 호출해야 한다.

    어떤 경우이든 non-blocking 모드 소켓의 처리는 다소 복잡하며 따라서 다음에 설명할 비동기 모드를 사용하는 것이 편리하다.


               1-2-3. Asynchronous(비동기) 모드


    비동기 모드에서도 non-blocking 모드에서처럼 소켓 관련 함수의 호출이 바로 리턴 된다.

    그러나 비동기 모드에서는 non-blocking 모드와 달리, 함수의 동작이 완료되는 시점, 또는 함수의 실행이 시작되지 못한 경우 다음에 다시 재 시도하여야 하는 시점을 시스템(Winsock.dll)이 메시지 처리 방식으로 나중에 응용 프로그램에게 알려준다. 즉, 비동기 모드의 소켓에서 소켓관련 함수의 실행결과의 에러코드가 WSAEWOULDBLOCK일 때의 의미는 다음과 같다.


    1) 함수의 동작이 완료되면 그 때 Winsock.dll이 메시지를 통하여 동작의 완료를 알려 주 거나,

    2) 함수의 동작이 시작하지 못했으며, 함수를 다시 호출해야 할 시점을 나중에 비동기 적으로 알려주겠음.


    UNIX와 같은 운영체제에서는 함수가 블록 되는 것이 문제가 되지 않으므로 반드시 비동기 모드의 소켓을 사용할 필요는 없다. 그러나 윈속에서는 비동기 모드로 소켓을 사용하는 것이 편리하다.

  • Profile
    ^^! 2004.06.02 23:44
    즐거운 하루되세요!