티스토리 뷰

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;
댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
글 보관함