Overlapped
모델 네트워크 프로그래밍
20051544 손은희
20051599 이유정
개념
• 입출력 방식에 따른 소켓 입출력 모델 분류
- 동기 입출력 + 비동기 통지 : Select 모델 , WSAAsyncSelect 모델 , WSAEventSelect 모
델
- 비동기 입출력 + 비동기 통지 : Overlapped 모델 (I), Overlapped 모델 (II), Completion
Port 모델
동기 입출력
• 애플리케이션은 입출력 함수를 호 출한 후 입출력 작업이 끝날 때까지 대기
• 입출력 작업이 끝나면 입출력 함수
는 리턴하고 애플리케이션은 입출
력 결과를 처리하거나 다른 작업을
진행
비동기 입출력
• 애플리케이션은 입출력 함수를 호출한 후 입출력 작업의 완료 여부와 무관하게 다른 작업을 진행
• 입출력 작업이 끝나면 운영체제는 작업 완료를 애플리케이션에게 알려줌
( 애플리케이션은 다른 작업을 중단하 고 입출력 결과를 처리 )
종류
종류 설명
Overlapped
(I) 소켓 입출력 작업이 완료되면 , 운영체제는 애플리케이션이 등록한 이벤트 객체를 신호 상태로 바꾼다 . 애플리케이션은 이벤트 객 체를 관찰함으로써 작업 완료 사실을 감지
Overlapped
(II) 소켓 입출력 작업이 완료되면 , 운영체제는 애플리케이션이 등록한 함수를 자동으로 호 출 한다 . 일반적으로 운영체제가 호출하는 애플리케이션 함수를 콜백 함수 (callback function) 라 부르는데 , 특별히
Overlapped 모델에서는 완료 루틴 (completion routine)
세 단계 공통 절차
• 비 동기 입출력을 지원하는 소켓을 생성 . (socket() 함수로 생성한 소켓은 기본적 으로 비 동기 입출력을 지원 )
• 비동기 입출력을 지원하는 소켓 함수를 호출
• 운영체제는 소켓 입출력 작업 완료를 애플리 케이션에 알려주고 (= 비동기 통지 ), 애 플리케이션은 입출력 결과를 처리
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
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
관련 구조체
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 () 에서 만 사용
• Scatter/Gather 입출력을 지원
- 송신 측에서 WSABUF 구조체를 사용하 면 , 여러 개의 버퍼에 저장된 데이터를 모 아서 (gather) 보냄
WSASend() 와 WSARecv() 함수
특징
WSASend() 와 WSARecv() 함수 특징
- 수신측에서도 역시 WSABUF 구조 체를 사용하면 , 받은 데이터를 여러 개의 버퍼에 흩뜨려 (scatter) 저장
• 마지막 두 인자에 모두 NULL 값을 사용하면 동기 함수로 동작
• Overlapped 모델 (I)- WSAOVERLAPPED 구조체의 hEvent 변수
• Overlapped 모델 (II)-
lpCompletionRoutine 인자를 사용
(lpCompletionRoutine 인자의 우선 순 위가
높으므로 이 값이 NULL 이 아니면
WSAOVERLAPPED 구조체의 hEvent 변수 는
사용 되지 않음 )
WSASend() 와 WSARecv() 함수
특징
Overlapped (I) 기본 절차
1. 비동기 입출력을 지원하는 소켓을 생성 (WSACreateEvent() 함수를 호출하 여 대응하는 이벤트 객체도 같이 생성 )
2. 비동기 입출력을 지원하는 소켓 함수를 호출 (WSAOVERLAPPED 구조체의
hEvent 변수에 이벤트 객체 핸들값을 넣어 서 전달 ) 비동기 입출력 작업이 곧바로 완 료되지 않으면 , 소켓 함수는 오류를 리턴하 고 오류 코드는 WSA_IO_PENDING 으로 설 정
나중에 비동기 입출력 작업이 완료되면 , 운영체제는 이벤트 객체를 신호 상태로 만들 어 이 사실을 애플리케이션에 알림
Overlapped (I) 기본 절차
3. WSAWaitForMultipleEvents() 함수 를 호출하여 이벤트 객체가 신호 상태가 되 기를 기다림
4. 비동기 입출력 작업이 완료하여
WSAWaitForMultipleEvents() 함수 가 리턴 ,WSAGetOverlappedResult() 함수를 호출하여 비동기 입출력 결과를 확인 하고 데이터를 처리
5. 새로운 소켓을 생성하면 1~4 를 , 그렇 지 않으면 2~4 를 반복
Overlapped (I) 기본 절차
WSAGetOverlappedResul
t()
Overlapped(I)
• 완료 루틴을 통해 비 동기 입출력 결과 를 처리
• 완료 루틴 (completion routine)
- 애플리케이션이 정의한 일종 의 콜백 함수
- 운영체제가 적절한 시점에 자동으로 호출
Overlapped (II)
• alertable wait 상태 : 비 동기 입출력을 위한 특별한 대기 상태로 , 비 동기 입출력 함수를 호출한 스레드가 이 상태에 있어야만 완료 루틴이 호출
• APC 큐 (Asynchronous Procedure Call Queue) 란 비동기 입출력 결과 저장을 위해 운영체 제가 각 스레드마다 할당하는 메모리 영역
Overlapped (II)
Overlapped (II) 기본 절차
1. 비동기 입출력을 지원하는 소켓을 생성 2. 비동기 입출력 함수 호출
( 완료 루틴의 시작 주소를 함수 인자전달 ) 비 동기 입출력 작업이 곧바로 완료되지 않으 면 , 소켓 함수는 오류를 리턴 ,
오류코드는 WSA_IO_PENDING 으로 설정
Overlapped (II) 기본 절차
3. 비 동기 입출력 함수를 호출한 스레드를 alertable wait 상태로 만듦
(WaitForSingleObjectEx(), WaitForMultipleObjectsEx(), SleepEx(),
WSAWaitForMultipleEvents() 등 함수 중에서 적절한 것을 선택하여 사용 )
4. 비 동기 입출력 작업이 완료되면 , 운영체 제는 완료 루틴을 호출
완료 루틴에서는 비 동기 입출력 결과를 확 인하고 데이터를 처리
5. 완료 루틴 호출이 모두 끝나면 , 스
레드는 alertable wait 상태에서 빠져 나옴
6. 새로운 소켓을 생성하면 1~5 를 , 그렇 지 않으면 2~5 를 반복