1.Event Select모델 이란 ?
2. 동작 원리
3. 입출력 절차
① WSACreateEvent() 함수를 이용하여 이벤트 객체를 생성한 다.
② WSAEventSelect() 함수를 이용하여 소켓에 이벤트 객체 연결 처리할 네트워크 연결
③ WSAWaitForMultipleEvents() 이벤트객체가 이벤트 발생유무를 확인 하기 위한 함수(신호 감지)
④ WSAEnumNetworkEvents() 함수를 호출하여 발생한 네트워크 이벤트 및 오류 를알아낸다
4.관련 함수 및 예제
1. WSAEventSelect() 함수
#include <winsock2.h> int WSAEventSelect(SOCKET S, WSAEVENT hEventObject, long lNetworkEvents); 성공시 0, 실패시 SOCKET_ERROR 반환 SOCKET S : 관찰대상인 소켓의 핸들 전달. WSAEVENT hEventObject : 이벤트 발생유무의 확인을 위한 이벤트객체 핸들 long lNetworkEvents : 감시하고자하는 이벤트의 종류 등록 |
S 에 전달된 핸들의 소켓에서 lNetworkEvents 에 전달된 이벤트중 하나가 발생하면, hEventObject에 전달된 핸들의 커널 오브젝트를 signaled(신호) 상태로 바꾸는 함수이다.
.
이벤트는 WSAAsyncSelect 모델 하고 같다.
2. 이벤트 객체 생성과 제거: WSACreateEvent(),WSACloseEvent()
WSAEVENT WSACreateEvent ( ) ; 성공: 이벤트 객체 핸들 리턴 실패: WSA_INVALID_EVENT 리턴 BOOL WSACloseEvent (WSAEVENT hEvent) ; 성공: TRUE, 실패: FALSE |
예제 코드
void Doit(intindex) { SOCKADDR_IN clientaddr; intlen = sizeof(clientaddr); SOCKETsock = sarr[index]; sarr[cnt] = accept(sock,(SOCKADDR*)&clientaddr,&len); hEarr[cnt] = WSACreateEvent(); //이벤트 객체 생성 WSAEventSelect(sarr[cnt],hEarr[cnt],FD_READ|FD_CLOSE);//소켓 ,객체 연결 cnt++; } |
3. 이벤트 객체의 신호 상태 감지하기 : WSAWaitForMultipleEvents() 함수
DWORD WSAWaitForMultipleEvents ( DWORD cEvents, const WSAEVENT* lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ) ; |
DWORD cEvents, : 이벤트 객체의 수 (하나의 소켓에 여러 개의이벤트 객체가능)
const WSAEVENT* lphEvents, : 이벤트 객체의 배열의 시작 주소(최대 64개가능)
BOOL fWaitAll,: 전체 신호 상태 / 단일 신호 상태에 따른 리턴시기를 구분
(TRUE 전달시 배열안의 이벤트 객체 가 전부 신호 상태이어야 리턴 가능)
(FALSE 전달시 배열안의 이벤트 객체가 하나라도 신호 상태이어도 리턴 가능)
DWORD dwTimeout,: 신호상태 감시할 시간 설정 (WSA_INFINITE : 무한대기)
BOOL fAlertable: 입출력 완료 시기
리턴 : 리턴값에서 WSA_WAIT_EVENT_0 인 상수를 빼면 이벤트 객체배열에서 이벤트가 발생한 이벤트핸들의 인덱스 값이 된다. 2개이상일경우 에는 인덱스가 작은 것부터 값을 얻는다.
4.구체적인 네트워크 이벤트 알아내기 :
int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ) ; 성공: 0, 실패: SOCKET_ERROR |
WSAEVENT hEventObject, : 소켓과 연결된, 신호상태인 이벤트 객체핸들 LPWSANETWORKEVENTS lpNetworkEvents : 발생한 이벤트의 유형정보와 오류정보로 채워질 WSANETWORKEVENTS 구조체 변수의 주소 값 전달
예제 코드 (WSAWaitForMultipleEvents 함수,WSAEnumNetworkEvents함수)
WSANETWORKEVENTSev; intindex; while(1){ index = WSAWaitForMultipleEvents (cnt,hEarr,FALSE,WSA_INFINITE,FALSE);//이벤트유무확인 index = index – WSA_WAIT_EVENT_0; WSAEnumNetworkEvents(sarr[index],hEarr[index],&ev);//구체적인 이벤트 및 오류 알아내기 switch(ev.lNetworkEvents){ caseFD_ACCEPT: //do it.. break; caseFD_READ: //do it.. break; caseFD_CLOSE: //do it. break; |
'API & MFC > 네트워크프로그래밍' 카테고리의 다른 글
EventSelect(클) (0) | 2010.02.05 |
---|---|
EventSelect(서버) (0) | 2010.02.05 |
ASyncSelect 예제 (1) | 2010.02.04 |
소켓통신의 라이브러리 사용 선택 시 고려사항 (0) | 2010.02.02 |
소켓함수 예제(로그인서버) (0) | 2010.01.25 |