CATEGORY

분류 전체보기 (73)
세상사는이야기 (27)
회사이야기 (7)
친구들이야기 (6)
공부이야기 (33)
개인적인이야기 (0)

RECENT ARTICLE

RECENT COMMENT

ARCHIVE

LINK



소켓 함수 호출시 동작방법을 두고서 Blocking Nonblocking이라 한다.

(1) Blocking

조건 만족이 되지 않는다면 함수는 리턴하지 않고 해당 스레드는 Wait State를 만족하게된다.

애플리케이션은 더이상 진행되지 않는다.

(2) NonBlocking

소켓 함수 호출시 조건이 만족되지 않더라도 함수가 리턴하므로 해당 쓰레드는 계속 진행이 가능해진다.

socket() 는 기본적으로 NonBlocking 모드의 함수이다.

// 블로킹 소켓 생성

SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);

if(listen_socket == SOCKET_ERROR) err_quit("socket()");


// NonBlocking 소켓 생성

u_long on = 1;

retval = iostlsocket(listen_sock, FIONBIO, &on);

if(retval == SOCKET_ERROR) err_quit("ioctlsocket()");


넌 블로킹 소켓에 대해 소켓 함수를 호출했을때는 조건이 만족되지 않아 작업을 완료할 수 없으면 소켓 함수는 오류를 리턴한다. 이때는 WSAGetLastError() 함수를 호출하여 반드시 오류 코드를 확인하여야한다.

넌 블로킹 소켓을 사용할 경우 대개 오류 코드는 WSAEWOULDBLOCK이 되며, 이는 조건이 만족되지 않음을 나타내므로 나중에 다시 소켓함수를 호출하면 된다.


(사용하는 곳 )

// 클라이언트와 데이터 통신에서

// 데이터 받는 부분

while(1){

      retval = recv(client_sock, buf, BUFSIZE, 0);

      if(retval == SOCKET_ERROR){

            if(WSAGetLastError() != WSAEWOULDBLOCK){

                 err_display("recv()");

                 break;

            }

      }

}


NonBlocking

 (장점) 소켓 함수 호출시 블록되지 않으므로 다른 작업을 진행 할 수 있다.

           멀티쓰레드를 사용하지 않고도 여러 개의 소켓 입출력을 처리할 수 있다.

 (단점) 소켓 함수를 호출할 때마다 WSAEWOULDBLOCK등 오류코드를 확인하고, 다시 해당함수를 호출해야 하므로 프로그램 구조가 복잡해진다.

           블로킹 소켓을 사용한 경우보다 CPU이용률이 높아진다.

출처 : Tong - redyoon님의 API / MFC통

And