54. session #2 를 수강하고 머리가 너무 복잡해 일단 전체적인 코드가 어떻게 돌아가는지 시작부터 정리해봤다.
아직 완성된 코드는 아니기때문에 최종본은 중간 정리와 좀 다를 수 있겠지만 전체적인 그림은 이렇다.
1. listener 만들고 start accept
소켓 만들고, cp에 소켓 감시 등록하고, 소켓 설정하고, 소켓 바인드하고, listen 함수 실행하고, AcceptEvent 만들어서 RegisterAccept에 넣어 실행.
2. Listener의 RegisterAccept
accept가 성공하면 새 클라가 연결되는거니까 그걸 담당할 Session을 새로 만들고, 소켓을 iocp가 감시하게 등록함. 그리고 session을 acceptEvent에 저장해둠.
AcceptEx를 실행함. 나중에 accept 감지되면 쓸 수 있게 acceptEvent 첨부함. AcceptEx는 소켓을 만들어서 return하는게 아니라 이미 만들어놓은 소켓을 클라가 쓰도록 만들어줌.
3. 이제 accept 발생할 때 까지 대기.
4. accept 발생하면 워커스레드의 IocpCore::Dispatch함수 에서 받음.
안에서 아까 첨부한 acceptEvent를 받고 이안에 이벤트 처리 주체(owner에 listener나 session) 에 대한 정보도 있음. owner는 무조건 dispatch함수가 있으니 () 그걸 실행시킴. 지금경우는 listener의 dispatch가 실행됨.
5. listener의 dispatch
받은 acceptEvent를 넣어서 ProcessAccept를 실행시킴.
ProcessAccept 에서는 클라이언트 소켓을 설정하고(listen 소켓 설정과 같게), 클라이언트 소켓으로부터 aockaddr 정보를 받아와 session에 저장해둠. (session은 아까 acceptEvent안에 저장해뒀어서 acceptEvent받을 때 같이 받은거)
이제 새로 연결된 세션의 session->ProcessConnect 실행.
그리고 다시 RegisterAccept 등록함. (2로 돌아가 반복됨)
여기서부터는 Listener와 Session 따로 돌아간다고 보면 될 듯 함
1. session의 ProcessConnect 에서는 서비스에 session 저장하고(아직 어디다 쓰는지 모름), OnConnected() 실행하고 (커넥트 되면 실행할것들 오버라이딩 함수로 실행), RegisterRecv()를 실행해 수신등록. 새 클라 받았으니 클라가 할 말 듣기위해 하는것.
2. RegisterRecv
_recvEvent 초기화 (_recvEvent는 세션의 정적변수로 있음)
이런저런 필요한거 준비해서 WSARecv 에 recvEvent 첨부해서 실행.
3. 대기하다가 클라에서 send 보내면 워커스레드의 IocpCore::Dispatch에서 감지해 _recvEvent 받음. owner (여기선 새로 연결된 클라이언트 Session) 의 dispatch 실행.
4. session의 dispatch를 발생한 이벤트에 따라 처리. 이번엔 recv이벤트이므로 ProcessRecv 실행될 것.
ProcessRecv 에서는 아직 뭘할지 구현되진 않았지만, 일단 에코서버라는 컨셉으로 오버라이딩된 OnRecv()를 사용해 클라이언트에 send를 한다. (코드상으로 실제 Send를 하진 않고 그냥 send라고 출력만 함)
그리고 RegisterRecv()로 다시 Recv 등록.
'강의 수강 > 게임서버(1)' 카테고리의 다른 글
| 69. 채팅 실습 (0) | 2025.08.18 |
|---|---|
| 68. 패킷 자동화 #2 (0) | 2025.08.18 |
| 67. 패킷 자동화 #1 (0) | 2025.08.17 |
| 66. Protobuf (0) | 2025.08.16 |
| 게임서버 공부 시작 (0) | 2025.03.27 |