5. 1. EasyServer.cpp (_tmain 3/4 )
스레드를 생성
ClientHandlingThread
함수를 실행한다.
SUSPENDED 상태다
DB Thread 생성
SUSPENDED 상태
전역 변수로 선언한
소켓에 accept 시도
Blocking 이므로 대기
Queue에 connectio이
있어야 넘어간다.
Accept 되면 Thread
Security 인자에 signal
을 줘서 실행시킨다
7. 1. EasyServer.cpp
(ClientHandlingThread 1/2 )
WaitableTimer를 생성한다.
이 Thread는 10 밀리초마다 TimeProc을
수행하는 타이머를 설정하게 된다.
두 번째 인자는 최초 대기 시간이다.
100 nanosecond 단위이다.
세 번째 인자는 Timer 주기를 나타낸다.
millisecond 단위이다.
8. 1. EasyServer.cpp
(ClientHandlingThread 2/2 )
WaitForSingleObjectEx 함수의 마지막 인자가 true
이므로 APC 큐에 뭔가 추가되면(연결이 되면) 호출
그렇지 않으면 대기 시간이 무한대이다
WaifForSingleObjectEx의 반환값이 WAIT_OBJECT_0
라면 signaled 상태라는 뜻이다.
이때 ClientManager는 새로운 ClientSession을 만든다.
g_AcceptedSocket은 지금 연결된 client 소켓 정보를
담고 있으므로 session 별로 고유한 소켓을 줄 수 있다.
ClientSession이 생성되었다면 연결 처리(OnConnect())
9. 1. EasyServer.cpp (TimeProc)
이 함수는 ClientManager에게 주기적으로 할 일을
시킨다.
TimeProc을 호출하는 타이머가 10 밀리초 주기를
가지기 때문에 OnPeriodWork() 역시 10 밀리초
주기로 호출된다.
11. 2. ClientManager (CreateClient)
Singleton
새로운 연결이 있으면 CreateClient
함수를 부르고 소켓 정보를 할당
ClientSession이 생성되고 나면
List 형태로 담고 있는 mClientList에
저장한다.
이후부터
Main함수는 ClientManager를 통해
ClientSession에 일을 시킨다.
17. 3. ClientSession (OnConnect)
소켓을 넌블러킹으로 바꾸지 않으면 서버 전체가 블로킹 될 수 있다.
Nagle 알고리즘을 끄면 서버 부하는 늘어나지만 실시간성은 높아진다. 채팅 서버이므로 끈다.
바로 PostRecv() 함수로 이어진다.
18. 3. ClientSession (PostRecv)
mRecvBuffer는 Circular Buffer.
소스를 열어보면 버퍼를 두 개
부분으로 나눠 적절히 교체한다
잘못 짜면 바로 터진다(…)
WSARecv 함수는 연결된 소켓
에서 데이터를 받아온다.
비동기 입출력이 가능하다.
WSABUF에 값이 저장되며, 여러
개의 버퍼를 지정할 수도 있다.
RecvCompletion Callback함수가
등록되어 있다.
20. 3. ClientSession (OnRead 1/2)
RecvBuffer에는 Client에서
받은 데이터가 들어있다.
이 데이터는 패킷이므로 약속된
패킷 헤더 정보를 통해 전송이
제대로 됐는지 확인할 수 있다.
제대로 패킷을 받았다면 계속
진행한다.
21. 3. ClientSession (OnRead 2/2)
패킷 type에 따라 다른 처리를 해 준다
로그인 패킷이면 DB에 값을 쓴다.
채팅 패킷이면 BroadCast 준비를 한다.
패킷을 보낸 플레이어의 id, 이름, 채팅
내용을 패킷에 담고 방송한다.
지금은 두 종류 패킷 밖에 없으므로 이
외에는 에러로 간주한다.
22. 3. ClientSession (SendRequest)
Broadcast를 실행하면 ClientSession들은
SendRequest 함수를 실행한다.
SendRequest 자체는 서버의 버퍼에만
패킷 정보를 쓰는 과정이다.
ClientManager에는 이렇게 ClientSession
버퍼에 저장된 패킷을 전송하라는 Flush
ClientSend 함수가 있다. 이 함수는
Manager에서 주기적으로 불려오므로
쌓인 패킷들도 주기적으로 전송된다.
26. 끝!
• 나머지 함수들은?
• 채팅 이외의 기능을 구현하려면 본격적으로 중요해진다
• 특히 DB 연동하는 부분은 캐릭터 좌표 등을 저장하고 있어서 일부러 언
급을 피했지만 채팅에 게임까지 들어가면 이 부분도 봐야 함
• 그 외
• Windows 시스템 프로그래밍 좀 더 봐야겠다
• MSDN도