달력

5

« 2024/5 »

  • 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
  • 31

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 클래스를 그대로 사용하지 않고, 이를 상속받는 클래스들이 각각의 기능에 맞게 해당 부분을 재정의 하여 사용할 수 있도록 하기 위함임.



:
Posted by 웽웽