EVENT SELECT WSAEvent Select WSAEvent Select WSAEvent Select

  • Slides: 15
Download presentation
EVENT SELECT 모 델

EVENT SELECT 모 델

목차 WSAEvent. Select 모델 이란? WSAEvent. Select 모델 관련 함수 WSAEvent. Select 예제 코드

목차 WSAEvent. Select 모델 이란? WSAEvent. Select 모델 관련 함수 WSAEvent. Select 예제 코드 1

관련 함수(이벤트 객체 생성과 제거) WSAEVENT WSACreate. Event ( ) ; 성공: 이벤트 객체

관련 함수(이벤트 객체 생성과 제거) WSAEVENT WSACreate. Event ( ) ; 성공: 이벤트 객체 핸들 리턴 실패: WSA_INVALID_EVENT 리턴 BOOL WSAClose. Event (WSAEVENT h. Event) ; 성공: TRUE, 실패: FALSE 6

관련 함수(소켓과 이벤트 객체 연결) int WSAEvent. Select ( SOCKET s, WSAEVENT h. Event.

관련 함수(소켓과 이벤트 객체 연결) int WSAEvent. Select ( SOCKET s, WSAEVENT h. Event. Object, long l. Network. Events ); 성공: 0, 실패: SOCKET_ERROR SOCKET s : 감시하고자 하는 소켓 핸들 WSAEVENT h. Event. Object : Create. Event()함수 호출시 반환되는 핸들 long l. Network. Events : 감시하고자 하는 이벤트의 종류 이벤트 종류 (FD_READ, FD_WRITE, FD_ACCEPT, FD_CLOSE. . ) 7

관련 함수(이벤트 객체의 신호 상태 감지) DWORD WSAWait. For. Multiple. Events ( DWORD c.

관련 함수(이벤트 객체의 신호 상태 감지) DWORD WSAWait. For. Multiple. Events ( DWORD c. Events, const WSAEVENT* lph. Events, BOOL f. Wait. All, DWORD dw. Timeout, BOOL f. Alertable ); DWORD c. Events : 이벤트 객체의 수 const WSAEVENT* lph. Events : 이벤트 객체 배열의 시작 주소(최대64개) BOOL f. Wait. All : 전체 신호 상태/단일 신호 상태에 따른 리턴 시기 구분 DWORD dw. Timeout : 신호상태 감시할 시간 설정 (WSA_INFINITE : 무한대기) BOOL f. Alertable : Completion Routine 설정 리턴: 리턴값에서 WSA_WAIT_EVENT_0 을 빼면 이벤트 객체배열에서 8 이벤트가 발생한 이벤트핸들의 인덱스 값이 된다.

관련 함수(구체적인 네트워크 이벤트 알아내기) int WSAEnum. Network. Events ( SOCKET s, WSAEVENT h.

관련 함수(구체적인 네트워크 이벤트 알아내기) int WSAEnum. Network. Events ( SOCKET s, WSAEVENT h. Event. Object, LPWSANETWORKEVENTS lp. Network. Events ); SOCKET s : 이벤트가 발생한 소켓의 핸들 WSAEVENT h. Event. Object : 이벤트가 발생한 이벤트객체 핸들 LPWSANETWORKEVENTS lp. Network. Events : 발생한 이벤트 정보와 오류 정보 저장. 성공: 0, 실패: SOCKET_ERROR 9

WSAEVENTSELECT 예제 코드 SOCKET sarr[WSA_MAXIMUM_WAIT_EVENTS]; HANDLE h. Earr[WSA_MAXIMUM_WAIT_EVENTS]; HANDLE h. File. Arr[WSA_MAXIMUM_WAIT_EVENTS]; int cnt;

WSAEVENTSELECT 예제 코드 SOCKET sarr[WSA_MAXIMUM_WAIT_EVENTS]; HANDLE h. Earr[WSA_MAXIMUM_WAIT_EVENTS]; HANDLE h. File. Arr[WSA_MAXIMUM_WAIT_EVENTS]; int cnt; SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); . . //소켓 생성 및 bind listen. . (생략) sarr[cnt]=sock; app. h. Earr[cnt] = WSACreate. Event(); WSAEvent. Select(sarr[cnt], h. Earr[cnt], FD_ACCEPT); cnt++; 10

WSAEVENTSELECT 예제 코드 WSANETWORKEVENTS ev; int index; while(1){ index = WSAWait. For. Multiple. Events

WSAEVENTSELECT 예제 코드 WSANETWORKEVENTS ev; int index; while(1){ index = WSAWait. For. Multiple. Events (cnt, h. Earr, FALSE, WSA_INFINITE, FALSE); index = index – WSA_WAIT_EVENT_0; WSAEnum. Network. Events(sarr[index], h. Earr[index], &ev); switch(ev. l. Network. Events){ case FD_ACCEPT: //do it. . break; case FD_READ: //do it. . break; case FD_CLOSE: //do it. . break; } } 11

WSAEVENTSELECT 예제 코드 void Accep. Proc(int index) { SOCKADDR_IN clientaddr; int len = sizeof(clientaddr);

WSAEVENTSELECT 예제 코드 void Accep. Proc(int index) { SOCKADDR_IN clientaddr; int len = sizeof(clientaddr); SOCKET sock = sarr[index]; sarr[cnt] = accept(sock, (SOCKADDR *)&clientaddr, &len); h. Earr[cnt] = WSACreate. Event(); WSAEvent. Select(sarr[cnt], h. Earr[cnt], FD_READ|FD_CLOSE); cnt++; } 12

WSAEVENTSELECT 예제 코드 void Read. Proc(int index) { char buf[256]; SOCKET sock = app.

WSAEVENTSELECT 예제 코드 void Read. Proc(int index) { char buf[256]; SOCKET sock = app. sarr[index]; if(recv(sock, buf, 100, 0)==-1) { return; } } void Close. Proc(int index) { WSAClose. Event(h. Earr[index]); closesocket(sarr[index]); cnt--; h. Earr[index] = h. Earr[now]; sarr[index] = sarr[now]; } 13

END 14

END 14