• 검색 결과가 없습니다.

Overlapped 모델

N/A
N/A
Protected

Academic year: 2023

Share "Overlapped 모델"

Copied!
26
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

Overlapped

모델 네트워크 프로그래밍

20051544 손은희

20051599 이유정

(2)

개념

• 입출력 방식에 따른 소켓 입출력 모델 분류

- 동기 입출력 + 비동기 통지 : Select 모델 , WSAAsyncSelect 모델 , WSAEventSelect 모

- 비동기 입출력 + 비동기 통지 : Overlapped 모델 (I), Overlapped 모델 (II), Completion

Port 모델

(3)

동기 입출력

• 애플리케이션은 입출력 함수를 호 출한 후 입출력 작업이 끝날 때까지 대기

• 입출력 작업이 끝나면 입출력 함수

는 리턴하고 애플리케이션은 입출

력 결과를 처리하거나 다른 작업을

진행

(4)

비동기 입출력

• 애플리케이션은 입출력 함수를 호출한 후 입출력 작업의 완료 여부와 무관하게 다른 작업을 진행

• 입출력 작업이 끝나면 운영체제는 작업 완료를 애플리케이션에게 알려줌

( 애플리케이션은 다른 작업을 중단하 고 입출력 결과를 처리 )

(5)

종류

종류 설명

Overlapped

(I) 소켓 입출력 작업이 완료되면 , 운영체제는 애플리케이션이 등록한 이벤트 객체를 신호 상태로 바꾼다 . 애플리케이션은 이벤트 객 체를 관찰함으로써 작업 완료 사실을 감지

Overlapped

(II) 소켓 입출력 작업이 완료되면 , 운영체제는 애플리케이션이 등록한 함수를 자동으로 호 출 한다 . 일반적으로 운영체제가 호출하는 애플리케이션 함수를 콜백 함수 (callback function) 라 부르는데 , 특별히

Overlapped 모델에서는 완료 루틴 (completion routine)

(6)

세 단계 공통 절차

• 비 동기 입출력을 지원하는 소켓을 생성 . (socket() 함수로 생성한 소켓은 기본적 으로 비 동기 입출력을 지원 )

• 비동기 입출력을 지원하는 소켓 함수를 호출

• 운영체제는 소켓 입출력 작업 완료를 애플리 케이션에 알려주고 (= 비동기 통지 ), 애 플리케이션은 입출력 결과를 처리

(7)

WSASend() 함수

int WSASend(

SOCKET s, //1

LPWSABUF lpBuffers, //2 DWORD dwBufferCount,//3

LPDWORD lpNumberOfBytesSent,//4 LPDWORD dwFlags,//5

LPWSAOVERLAPPED lpOverlapped,//6

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine//7 );

성공 :0, 실패 :SOCKET_ERROR

(8)

WSARecv() 함수

int WSARecv(

SOCKET s, //1

LPWSABUF lpBuffers, //2 DWORD dwBufferCount,//3

LPDWORD lpNumberOfBytesRecvd,//4 LPDWORD lpFlags,//5

LPWSAOVERLAPPED lpOverlapped,//6

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine//7 );

성공 :0, 실 패 :SOCKET_ERROR

(9)

관련 구조체

LPWSABUF lpBuffers

typedef struct __WSABUF{

u_long len; // 길이 ( 바이트 단위 ) char FAR* buf; // 버퍼 시작 주소 }WSABUF, *LPWSABUF;

LPWSAOVERLAPPED lpOverlapped typedef struct _WSAOVERLAPPED{

DWORD Internal;

DWORD InternalHigh;

DWORD Offset;

DWORD OffsetHigh;

WSAEVENT hEvent; // 이벤트 객체 핸들값 } WSAOVERLAPPED, *LPWSAOVERLAPPED;

Overlapped () 에서 만 사용

(10)

• Scatter/Gather 입출력을 지원

- 송신 측에서 WSABUF 구조체를 사용하 면 , 여러 개의 버퍼에 저장된 데이터를 모 아서 (gather) 보냄

WSASend() WSARecv() 함수

특징

(11)

WSASend() WSARecv() 함수 특징

- 수신측에서도 역시 WSABUF 구조 체를 사용하면 , 받은 데이터를 여러 개의 버퍼에 흩뜨려 (scatter) 저장

(12)

마지막 두 인자에 모두 NULL 값을 사용하면 동기 함수로 동작

• Overlapped 모델 (I)- WSAOVERLAPPED 구조체의 hEvent 변수

• Overlapped 모델 (II)-

lpCompletionRoutine 인자를 사용

(lpCompletionRoutine 인자의 우선 순 위가

높으므로 이 값이 NULL 이 아니면

WSAOVERLAPPED 구조체의 hEvent 변수

사용 되지 않음 )

WSASend() WSARecv() 함수

특징

(13)

Overlapped (I) 기본 절차

1. 비동기 입출력을 지원하는 소켓을 생성 (WSACreateEvent() 함수를 호출하 여 대응하는 이벤트 객체도 같이 생성 )

(14)

2. 비동기 입출력을 지원하는 소켓 함수를 호출 (WSAOVERLAPPED 구조체의

hEvent 변수에 이벤트 객체 핸들값을 넣어 서 전달 ) 비동기 입출력 작업이 곧바로 완 료되지 않으면 , 소켓 함수는 오류를 리턴하 고 오류 코드는 WSA_IO_PENDING 으로 설

나중에 비동기 입출력 작업이 완료되면 , 운영체제는 이벤트 객체를 신호 상태로 만들 어 이 사실을 애플리케이션에 알림

Overlapped (I) 기본 절차

(15)

3. WSAWaitForMultipleEvents() 함수 를 호출하여 이벤트 객체가 신호 상태가 되 기를 기다림

4. 비동기 입출력 작업이 완료하여

WSAWaitForMultipleEvents() 함수 가 리턴 ,WSAGetOverlappedResult() 함수를 호출하여 비동기 입출력 결과를 확인 하고 데이터를 처리

5. 새로운 소켓을 생성하면 1~4 를 , 그렇 지 않으면 2~4 를 반복

Overlapped (I) 기본 절차

(16)

WSAGetOverlappedResul

t()

(17)

Overlapped(I)

(18)

• 완료 루틴을 통해 비 동기 입출력 결과 를 처리

• 완료 루틴 (completion routine)

- 애플리케이션이 정의한 일종 의 콜백 함수

- 운영체제가 적절한 시점에 자동으로 호출

Overlapped (II)

(19)

• alertable wait 상태 : 비 동기 입출력을 위한 특별한 대기 상태로 , 비 동기 입출력 함수를 호출한 스레드가 이 상태에 있어야만 완료 루틴이 호출

• APC 큐 (Asynchronous Procedure Call Queue) 란 비동기 입출력 결과 저장을 위해 운영체 제가 각 스레드마다 할당하는 메모리 영역

Overlapped (II)

(20)

Overlapped (II) 기본 절차

1. 비동기 입출력을 지원하는 소켓을 생성 2. 비동기 입출력 함수 호출

( 완료 루틴의 시작 주소를 함수 인자전달 ) 비 동기 입출력 작업이 곧바로 완료되지 않으 면 , 소켓 함수는 오류를 리턴 ,

오류코드는 WSA_IO_PENDING 으로 설정

(21)

Overlapped (II) 기본 절차

3. 비 동기 입출력 함수를 호출한 스레드를 alertable wait 상태로 만듦

(WaitForSingleObjectEx(), WaitForMultipleObjectsEx(), SleepEx(),

WSAWaitForMultipleEvents() 등 함수 중에서 적절한 것을 선택하여 사용 )

(22)

4. 비 동기 입출력 작업이 완료되면 , 운영체 제는 완료 루틴을 호출

완료 루틴에서는 비 동기 입출력 결과를 확 인하고 데이터를 처리

5. 완료 루틴 호출이 모두 끝나면 , 스

레드는 alertable wait 상태에서 빠져 나옴

6. 새로운 소켓을 생성하면 1~5 를 , 그렇 지 않으면 2~5 를 반복

Overlapped (II) 기본 절차

(23)

완료루틴의 형태

(24)

Overlapped(II)

(25)

연습 문제 1

(26)

연습 문제 2

참조

관련 문서

– 가상 머신 하드 드라이브 생성.. Virtual

Label 객체 역시 버튼 객체와 같이 몇 가지 다른 종류의 생성 자 함수를 제공하고 있는데 Label 없이 생성하려는 경우 인 수 없는 Label() 생성자를 사용하고 처음부터

소켓 으로 부터 InputStream과 OutputStream 생성 소켓 을 이용한 통신.. 소켓

소켓 으로 부터 InputStream과 OutputStream 생성 소켓 을 이용한 통싞. 소켓

 ms가 소유하고 있는 객체의 마방짂 차수가 유효하면 TRUE, 아니면 FALSE를 얻는다..

이 학생들의 숙제1, 숙제2, 숙제3의 성적을 가상으로 만들어서 exam.txt 파일에 아래와

보안로그 : 유효하거나 유효하지 않은 로그온 시도, 파일의 생성/열람/삭제에 관련된 이벤트 시스템 로그 : 시스템 부팅 등 윈도우 시스템의 구성요소와

 Class는 스스로 객체 생성 방법을 가지고 있어야 한다... 더 이상