140702_온라인 게임 서버 프로그래밍_EventSelect DATA_OLD/Server Study2014. 7. 2. 21:40
EventSelect 클래스
클라이언트에서 많이 쓰이는 방식이자 일반적인 소켓 사용 방법.
스레드를 하나 생성하여 그 스레드 안에서 지정한 소켓의 모든 이벤트(Read, Write등)를 검출해내는 구조로 구성.
CEventSelect() - 생성자. 이벤트와 스레드를 관리하는 여러 핸들들과 소켓 핸들을 초기화시킴. 그 중에서도 mSelectEventHandle이 모든 소켓이벤트의 중심이 되는 중요한 역할을 함.
mSelectThreadHandle : 소켓 이벤트를 관리할 스레드 핸들
mDestroyEventHandle : 스레드 종료 이벤트 핸들
mStartupEventHandle : 스레드 시작 이벤트 핸들
Begin() - 소켓 이벤트 관리 스레드 생성 및 WSAEventSelect를 이용해 사용할 소켓 이벤트 등록.
- 소켓 이벤트 관리 이벤트 / 스레드 종료 이벤트 / 스레드 시작 이벤트 /소켓 이벤트 관리 스레드 생성
- WSAEventSelect() : 사용할 소켓 이벤트들을 등록하여 해당 소켓의 이벤트를 검출함.
해당 소켓에 등록한 이벤트가 발생되었을 경우 mSelectThreadHandle에 SelectThreadCallback함수가 등록된 스레드가 생성되어 해당 이벤트에 대한 처리가 이루어짐.
- WaitForSingleObject() : 스레드 생성 완료까지 대기 후, 스레드가 Wait될 때까지 시간을 벌어줌. 스레드가 생성되면서 등록한 이벤트 핸들(mStartupEventHandle)에 이벤트가 발생하면 함수 종료.
End() - 이벤트 변수들의 초기화 및 스레드 종료 이벤트를 발생시켜 해당 스레드가 종료될 때까지 대기함.
SelectThreadCallBack() - 소켓 이벤트를 관리하는 스레드. 실제 소켓 관련 이벤트가 발생했을 때 처리하는 스레드.
- WaitForMultipleObjects : 임시 핸들 배열에 저장해둔 mDestroyEventHandle과 mSelectEventHandle 두개의 핸들에 이벤트가 발생할 때까지 대기. 이벤트 발생 시, 해당 코드는 EventID에 등록된다. EventID에 들어간 값에 대한 switch문으로 각각의 케이스에 따른 작업 수행.
- WSAEnumNetworkEvents() : 소켓에 관련된 이벤트가 발생했을 때 해당 이벤트를 받아오는 함수. NETWORKEVENTS 형식인 NetworkEvents 변수에다가 소켓에 발생한 네트워크 이벤트를 받음. 각각의 이벤트에 따라 가상함수를 호출함.
* 여기서 가상함수를 사용하는 이유는, 이 EventSelect 클래스를 그대로 사용하지 않고, 이를 상속받는 클래스들이 각각의 기능에 맞게 해당 부분을 재정의 하여 사용할 수 있도록 하기 위함임.
'DATA_OLD > Server Study' 카테고리의 다른 글
140707_IOCP 예제 분석 (0) | 2014.07.07 |
---|---|
140703_온라인 게임 서버 프로그래밍_IOCP (0) | 2014.07.03 |
140701_온라인 게임 서버 프로그래밍_PacketSession (0) | 2014.07.01 |
140630_온라인 게임 서버 프로그래밍_NetworkSession (0) | 2014.06.30 |