본문 바로가기

Network Programing/Network 개념

소켓 입출력 모델 - 1.Select 모델

소켓 입출력 모델의 경우 

 1. Select 모델

 2. WSAAsyncSelect 모델

 3. WSAEventSelect 모델

 4. Overapped 모델

들이 있다.


1. Select 모델

 - Select()함수가 핵심적인 역할을 하며 소켓모드(블로킹, 넌블로킹)에 관계없이 여러 소켓을 한 스레드로 처리 할 수 있다.

 - Select 모델이 제공하는 기능을 소켓 함수를 호출해야 할 시점을 알려줌으로써 함수 호출 시 항상 성공하도록 하는 것 

 - 동작원리

  ㆍ세 개의 소켓 셋(Socket set)을 준비 해야 하며

  ㆍ소켓 셋은 소켓 디스크립터의 집합으로써 해당 소켓으로 하고자 하는 작업의 종류를 나타낸다.

    *만약 어떤 소켓의 recv()함수를 호출해야 할 시점을 알고 싶으면 읽기 셋에 넣고, Send()함수를 호출해야할 시점을 알고 싶다면

       쓰기 셋에 넣으면 된다.

    *소켓 셋을 준비해서 Select()함수에 전달하면 함수는 소켓 셋에 포함된 소켓에 대해 해당 작업을 할 수 있을 떄 까지 대기한다.

    *적어도 1개의 소켓이 준비되면 Select()함수를 리턴한다. 이떄 소켓 셋에는 준비된 소켓만 남고 나머지는 모두 제거된다.

 

 - 읽기 셋(read Set)

    ㆍ클라이언트가 접속했으므로 accept()함수를 호출할 수 있다.

    ㆍ데이터를 받았으므로 recv(), recvfrom() 등의 함수를 호출할 수 있다.

    ㆍ연결이 종료되었으므로 recv(), recvfrom() 등의 함수를 호출 할 수 있다 이때 리턴값은 0 or SOCKET_ERROR이 된다.

  - 쓰기 셋(write Set)

    ㆍ함수 호출 시점 : 송신 버퍼가 충분하므로 send(), sendto() 등의 함수를 호출하여 데이터를 보낼 수 있다.

    ㆍ함수 호출 결과 : 넌블로킹 소켓을 사용한 Connect() 함수 호출이 성공하였다.

  - 예외 셋(exception Set)

    ㆍ함수 호출 시점 : OOB(Out-Of-Band) 데이터가 도착했으므로 recv(), recvfrom() 등의 함수를 호출하여 OOB 데이터를 받을 수 있다.

    ㆍ함수 호출 결과 : 넌블로킹 소켓을 사용한 Connect()함수 호출이 실패 했다.

※ OOB(Out-Of-Band) 란?

  - TCP에서 긴급한 데이터의 통신을 위해서 사용