190710 - Study - 비동기 Notificaion IO 모델
본 글은 교육을 받으며 노트필기한 내용을 그대로 올린것 입니다.
비동기 Notification IO 모델 구현 방법 2가지
1. WSAAsyncSelect() 사용 : 발생한 이벤트를 수신한 위도우의 핸들 지정 필요.
2. WSAEventSelect() 사용 :
● WSAEventSelect : 임의의 소켓을 대상으로 이벤트 발생여부를 관찰하도록 한다.
이벤트 발생 유무에 관계없이 바로 반환한다.
int WSAAPI WSAEventSelect(
SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents
);
● manual-reset 모드이면서 non-signaled 상태인 Event 오브젝트가 필요하다.
WSAEVENT 는 HANDLE과 같다.
WSAEVENT WSAAPI WSACreateEvent(
);
● WSACreateEvent로 이벤트 오브젝트를 생성한다.
DWORD WSAAPI WSAWaitForMultipleEvents(
DWORD cEvents,// 이벤트 오브젝트 개수 (64개로 제한(2019현재))
const WSAEVENT *lphEvents,//핸들을 저장한 배열 주소값
BOOL fWaitAll,//TRUE시 모든 이벤트 기다림
DWORD dwTimeout,//타임아웃지정
BOOL fAlertable//TRUE시 alertable wait
);// 성공시 이벤트 오브젝트 관련정보 반환
● 이벤트의 발생유무를 확인하는 함수이다.
신호 상태로 바뀐 Event오브젝트의 첫 번째 인덱스 값을 알려준다.
위 정보로 첫 인덱스 값을 안뒤에 for문을 돌려 WSAWaitForMultipleEvents를 재차 실행하여 신호상태가된 이벤트를 모두 알 수 있다.
manual-reset 모드를 사용한 이유이기도하다.
과한미래예측설계 : 프레드 같은사람이 만든다
● 왜 신호상태가 됐는지 알아야한다.
int WSAAPI WSAEnumNetworkEvents(
SOCKET s,//이벤트 발생한 소켓 핸들
WSAEVENT hEventObject,//소켓과 연결된 신호상태의 이벤트오브젝트 핸들
LPWSANETWORKEVENTS lpNetworkEvents//발생한 이벤트 정보얻어올 구조체 변수 주소
);// 성송시 0 그리고 비신호 상태로 전환해준다.(Reset이 필요없다.)
SOCKET s,//이벤트 발생한 소켓 핸들 : 이벤트 오브젝트 그리고 해당 오브젝트에 연결되는 소켓 두 가지정보를 알아야한다. (두 개의 배열에 동일 인덱스로 저장하는 방법 등이 필요하다.)
●LPWSANETWORKEVENTS 구조체 정보
typedef struct _WSANETWORKEVENTS {
long lNetworkEvents; // 발생한 이벤트의 정보
int iErrorCode[FD_MAX_EVENTS]; //오류 발생에 대한 정보
} WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
'Socket Programming' 카테고리의 다른 글
비동기 IO (Overlapped IO) (0) | 2019.09.18 |
---|---|
File IO, fopen_s, fseek, fread, fclose + 윈도우 소켓 라이브러리 (0) | 2019.07.23 |
[Window Socket] 다이얼로그기반 서버 클라이언트 (0) | 2019.07.23 |
[Window Socket] 다중처리 에코 서버, 클라이언트, 데이터 경계 (0) | 2019.07.15 |
[Window Socket] WSAStartup, 바이트 정렬, IP주소변환, 기본함수 (0) | 2019.07.15 |