Presentation is loading. Please wait.

Presentation is loading. Please wait.

10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.

Similar presentations


Presentation on theme: "10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다."— Presentation transcript:

1 10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.
WSAAsyncSelect 소켓 입출력 모델을 이해하고 활용한다. WSAEventSelect 소켓 입출력 모델을 이해하고 활용한다.

2 소켓 모드 (1) 소켓 모드 블로킹 소켓 블로킹 소켓과 넌블로킹 소켓으로 구분
소켓 함수 호출 시 조건이 만족되지 않으면 함수가 리턴하지 않고 스레드 실행이 정지 조건이 만족되면 소켓 함수가 리턴하면서 정지된 스레드가 깨어나 실행을 재개 소켓 함수 리턴 조건 accept() 접속한 클라이언트가 있을 때 connect() 서버에 접속이 성공했을 때 send(), sendto() 응용 프로그램이 전송을 요청한 데이터를 소켓 송신 버퍼에 모두 복사했을 때 recv(), recvfrom() 소켓 수신 버퍼에 도착한 데이터가 1바이트 이상 있고 이를 응용 프로그램이 제공한 버퍼에 복사했을 때

3 소켓 모드 (2) 넌블로킹 소켓 소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 스레드가 중단 없이 다음 코드를 수행 socket() 함수는 기본적으로 블로킹 소켓을 생성하므로 ioctlsocket() 함수를 호출해 넌블로킹 소켓으로 전환 // 블로킹 소켓 생성 SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) err_quit("socket()"); // 넌블로킹 소켓으로 전환 u_long on = 1; retval = ioctlsocket(sock, FIONBIO, &on); if(retval == SOCKET_ERROR) err_quit("ioctlsocket()");

4 소켓 모드 (3) 넌블로킹 소켓과 소켓 함수 넌블로킹 소켓에 대해 소켓 함수를 호출할 때 조건이 만족되지 않으면 소켓 함수는 오류를 리턴 WSAGetLastError() 함수를 이용해 오류 코드를 확인 대개 오류 코드는 WSAEWOULDBLOCK 조건이 만족되지 않았음을 나타내므로 나중에 다시 소켓 함수를 호출하면 됨

5 소켓 모드 (4) 넌블로킹 소켓의 특징 장점 소켓 함수 호출 시 항상 리턴하므로 조건이 만족되지 않아 스레드가 오랜 시간 정지하는 상황, 즉 교착 상태가 생기지 않는다. 멀티스레드를 사용하지 않고도 여러 소켓에 대해 돌아가면서 입출력을 처리할 수 있다. 필요하다면 중간에 소켓과 직접 관계가 없는 다른 작업을 할 수도 있다. 단점 소켓 함수를 호출할 때마다 WSAEWOULDBLOCK과 같은 오류 코드를 확인하고 처리해야 하므로 프로그램 구조가 복잡해진다. 블로킹 소켓을 사용한 경우보다 CPU 사용률이 높다.

6 서버 작성 모델 반복 서버 병행 서버 여러 클라이언트를 한 번에 하나씩 처리 여러 클라이언트를 동시에 처리 장점
스레드 한 개만으로 구현하므로 시스템 자원 소모가 적음 단점 한 클라이언트의 처리 시간이 길어지면 다른 클라이언트의 대기 시간이 길어짐 장점 한 클라이언트의 처리 시간이 길어지더라도 다른 클라이언트에 영향을 주지 않음 단점 스레드를 여러 개 생성하여 구현하므로 시스템 자원 소모가 많음

7 이상적인 소켓 입출력 모델의 특징 이상적인 서버의 기능 이상적인 소켓 입출력 모델의 특징 가능한 많은 클라이언트가 접속 가능
서버는 각 클라이언트의 서비스 요청에 빠르게 반응하며 고속으로 데이터를 전송 시스템 자원 사용량을 최소화 이상적인 소켓 입출력 모델의 특징 소켓 함수 호출 시 블로킹을 최소화 스레드 개수를 일정 수준으로 유지 CPU 명령 수행과 입출력 작업을 병행 유저 모드와 커널 모드 전환 횟수를 최소화

8 소켓 입출력 모델의 종류 윈도우 운영체제의 소켓 입출력 모델 지원 소켓 입출력 모델 운영체제 버전 윈도우 CE 윈도우
(클라이언트 버전) (서버 버전) Select CE 1.0 이상 윈도우 95 이상 윈도우 NT 이상 WSAAsyncSelect x WSAEventSelect CE .NET 4.0 이상 윈도우 NT 3.51 이상 Overlapped Completion Port 윈도우 NT 3.5 이상(윈도우 95/98/Me 제외)

9 Select 모델 (1) Select 모델 핵심 원리 select() 함수가 핵심적인 역할을 함
소켓 모드(블로킹, 넌블로킹)와 관계없이 여러 소켓을 한 스레드로 처리 가능 핵심 원리 소켓 함수 호출이 성공할 수 있는 시점을 미리 알 수 있어서 소켓 함수 호출 시 조건이 만족되지 않아 생기는 문제를 해결할 수 있음 블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 방지 넌블로킹 소켓: 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야 하는 상황을 방지

10 Select 모델 (2) 동작 원리 읽기 셋 쓰기 셋 예외 셋 소켓 select(...); 호출 읽기 셋 쓰기 셋 예외 셋
리턴

11 Select 모델 (3) 소켓 셋의 역할 - 각각 읽기, 쓰기, 예외 셋 함수 호출 시점
접속한 클라이언트가 있으므로 accept() 함수를 호출할 수 있음 소켓 수신 버퍼에 도착한 데이터가 있으므로 recv(), recvfrom() 등의 함수를 호출해 데이터를 읽을 수 있음 TCP 연결이 종료되었으므로 recv(), recvfrom() 등의 함수를 호출해 연결 종료를 감지할 수 있음 함수 호출 시점 소켓 송신 버퍼의 여유 공간이 충분하므로 send(), sendto() 등의 함수를 호출하여 데이터를 보낼 수 있음 함수 호출 결과 넌블로킹 소켓을 사용한 connect() 함수 호출이 성공함 함수 호출 시점 OOB(Out-Of-Band) 데이터가 도착했으므로 recv(), recvfrom() 등의 함수를 호출하여 OOB 데이터를 받을 수 있음 함수 호출 결과 넌블로킹 소켓을 사용한 connect() 함수 호출이 실패함

12 Select 모델 (4) select() 함수 int select ( int nfds, fd_set *readfds,
fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout ) ; 성공: 조건을 만족하는 소켓의 개수 또는 0(타임아웃), 실패: SOCKET_ERROR

13 Select 모델 (5) select() 함수를 이용한 소켓 입출력 절차 ① 소켓 셋을 비움(초기화).
② 소켓 셋에 소켓을 넣음. 넣을 수 있는 소켓의 최대 개수는 FD_SETSIZE(=64)로 정의되어 있음 ③ select() 함수 호출. 타임아웃이 NULL이면 select() 함수는 조건을 만족하는 소켓이 있을 때까지 리턴하지 않음 ④ select() 함수가 리턴하면 소켓 셋에 남아 있는 모든 소켓에 대해 적절한 소켓 함수를 호출하여 처리 ⑤ ①~④를 반복

14 Select 모델 (6) 소켓 셋을 조작하는 매크로 함수 매크로 함수 기능 FD_ZERO(fd_set *set)
셋을 비움(초기화) FD_SET(SOCKET s, fd_set *set) 셋에 소켓 s를 넣음 FD_CLR(SOCKET s, fd_set *set) 셋에서 소켓 s를 제거 FD_ISSET(SOCKET s, fd_set *set) 소켓 s가 셋에 들어 있으면 0이 아닌 값을 리턴. 그렇지 않으면 0을 리턴

15 SelectTCPServer 예제의 소켓 정보 관리 (1)
소켓 정보 관리를 위한 구조 SOCKETINFO * SOCKETINFO{} FD_SETSIZE

16 SelectTCPServer 예제의 소켓 정보 관리 (2)
소켓 정보 추가하기 소켓 정보 추가

17 SelectTCPServer 예제의 소켓 정보 관리 (3)
소켓 정보 삭제하기 소켓 정보 삭제 이동

18 WSAAsyncSelect 모델 (1) WSAAsyncSelect 모델
소켓과 관련된 네트워크 이벤트를 윈도우 메시지로 받음 모든 소켓과 관련된 메시지가 한 윈도우, 즉 한 윈도우 프로시저에 전달되므로 멀티스레드를 사용하지 않고도 여러 소켓을 처리 가능

19 WSAAsyncSelect 모델 (2) 동작 원리 메시지 큐 소켓 관련 메시지 소켓

20 WSAAsyncSelect 모델 (3) WSAAsyncSelect 모델을 이용한 소켓 입출력 절차
② 등록한 네트워크 이벤트가 발생하면 윈도우 메시지가 발생하여 윈도우 프로시저가 호출됨 ③ 윈도우 프로시저에서는 받은 메시지의 종류에 따라 적절한 소켓 함수를 호출하여 처리

21 WSAAsyncSelect 모델 (4) WSAAsyncSelect() 함수 사용 예 int WSAAsyncSelect (
SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent ) ; 성공: 0, 실패: SOCKET_ERROR #define WM_SOCKET (WM_USER+1) // 사용자 정의 윈도우 메시지 ... WSAAsyncSelect(s, hWnd, WM_SOCKET, FD_READ|FD_WRITE);

22 WSAAsyncSelect 모델 (5) 네트워크 이벤트를 나타내는 상수 네트워크 이벤트 의미 FD_ACCEPT
접속한 클라이언트가 있다. FD_READ 데이터 수신이 가능하다. FD_WRITE 데이터 송신이 가능하다. FD_CLOSE 상대가 접속을 종료했다. FD_CONNECT 통신을 위한 연결 절차가 끝났다. FD_OOB OOB 데이터가 도착했다.

23 WSAAsyncSelect 모델 (6) 윈도우 프로시저 hwnd : 메시지가 발생한 윈도우의 핸들
msg : WSAAsyncSelect() 함수 호출 시 등록했던 사용자 정의 메시지 wParam : 네트워크 이벤트가 발생한 소켓 lParam : 하위 16비트는 발생한 네트워크 이벤트 상위 16비트는 오류 코드 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { .... }

24 AsyncSelectTCPServer 예제의 소켓 정보 관리 (1)
소켓 정보 관리를 위한 구조 소켓 정보 추가하기 SOCKETINFO{} SocketInfoList 추가

25 AsyncSelectTCPServer 예제의 소켓 정보 관리 (2)
소켓 정보 삭제하기 삭제

26 WSAEventSelect 모델 (1) WSAEventSelect 모델
소켓 함수 호출이 성공할 수 있는 시점을 이벤트 객체를 통해 감지 소켓에 대해 이벤트 객체를 생성하여 짝지어두면 네트워크 이벤트가 발생할 때마다 이벤트 객체가 신호 상태가 됨 이벤트 객체의 상태 변화를 관찰함으로써 네트워크 이벤트 발생을 감지

27 WSAEventSelect 모델 (2) 동작 원리 네트워크 이벤트 소켓 이벤트 객체 소켓 네트워크 이벤트 발생 이벤트 객체

28 WSAEventSelect 모델 (3) WSAEventSelect 모델의 필요 기능과 관련 함수 이벤트 객체 생성과 제거
WSACreateEvent(), WSACloseEvent() 소켓과 이벤트 객체 짝짓기 WSAEventSelect() 이벤트 객체의 신호 상태 감지하기 WSAWaitForMultipleEvents() 구체적인 네트워크 이벤트 알아내기 WSAEnumNetworkEvents()

29 WSAEventSelect 모델 (4) WSAEventSelect 모델을 이용한 소켓 입출력 절차
① 소켓을 생성할 때마다 WSACreateEvent() 함수를 이용해 이벤트 객체를 생성 ② WSAEventSelect() 함수를 이용해 소켓과 이벤트 객체를 짝지음과 동시에 처리할 네트워크 이벤트를 등록 ③ WSAWaitForMultipleEvents() 함수를 호출해 이벤트 객체가 신호 상태가 되기를 기다림. 등록한 네트워크 이벤트가 발생하면 해당 소켓과 연관된 이벤트 객체가 신호 상태가 됨 ④ WSAEnumNetworkEvents() 함수를 호출해 발생한 네트워크 이벤트를 알아내고 적절한 소켓 함수를 호출해 처리

30 WSAEventSelect 모델 (5) 이벤트 객체 생성과 제거하기 WSAEVENT WSACreateEvent ( ) ;
성공: 이벤트 객체 핸들, 실패: WSA_INVALID_EVENT BOOL WSACloseEvent (WSAEVENT hEvent) ; 성공: TRUE, 실패: FALSE

31 WSAEventSelect 모델 (6) 소켓과 이벤트 객체 짝짓기 int WSAEventSelect ( SOCKET s,
WSAEVENT hEventObject, long lNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR

32 WSAEventSelect 모델 (7) 이벤트 객체의 신호 상태 감지하기
DWORD WSAWaitForMultipleEvents ( DWORD cEvents, const WSAEVENT *lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ) ; 성공: WSA_WAIT_EVENT_0 ~ WSA_WAIT_EVENT_0+cEvents-1 또는 WSA_WAIT_TIMEOUT 실패: WSA_WAIT_FAILED

33 WSAEventSelect 모델 (8) 구체적인 네트워크 이벤트 알아내기 int WSAEnumNetworkEvents (
SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR

34 WSAEventSelect 모델 (9) 예제 코드 SOCKET s; WSAEVENT hEvent;
WSANETWORKEVENTS NetworkEvents; ... WSAEnumNetworkEvents(s, hEvent, &NetworkEvents); // FD_ACCEPT 이벤트 처리 if(NetworkEvents.lNetworkEvents & FD_ACCEPT){ if(NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0){ printf("오류 코드 = %d\n", NetworkEvents.iErrorCode[FD_ACCEPT_BIT]); } else{ // accept() 함수 호출

35 WSAEventSelect 모델 (10) 예제 코드(계속) // FD_READ 이벤트 처리
if(NetworkEvents.lNetworkEvents & FD_READ){ if(NetworkEvents.iErrorCode[FD_READ_BIT] != 0){ printf("오류 코드 = %d\n", NetworkEvents.iErrorCode[FD_READ_BIT]); } else{ // recv() 함수 호출

36 EventSelectTCPServer 예제의 소켓 정보 관리 (1)
소켓 정보 관리를 위한 구조 SOCKETINFO * SOCKETINFO{} WSA_MAXIMUM_WAIT_EVENTS

37 EventSelectTCPServer 예제의 소켓 정보 관리 (2)
소켓 정보 추가하기 소켓 정보 추가

38 EventSelectTCPServer 예제의 소켓 정보 관리 (3)
소켓 정보 삭제하기 소켓 정보 삭제 이동

39 Thank you TCP/IP 윈도우 소켓 프로그래밍


Download ppt "10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다."

Similar presentations


Ads by Google