1. 다음부터는 이런 귀찮은 일련의 작업들에게서 벗어나기 위해 만들었다. 저번에 이벤트 방식으로 한번 만들어두긴 했는데, 확실히 다른 작업을 또 진행할때 소켓 할당하고 뭐 주소값 넣고.. 이런 귀찮은 작업들이나 더 나아가서 Send나 Recv가 필요할 때도 그 많은 인자값들을 일일히 넣어주지 않아도 되고... 다 만든 건 아직 아닌데 기초적인 기능들은 다 구현했고 사용자 편의성만 좀 높여주면 된다. 지금은 좀 거지같다.
2. 서버 사이드
* CreateServerSocket 함수를 호출하면 자동으로 내부에 CompletionThread풀과 접속 가능한 유저 리스트 등을 생성한다. 클라이언트 접속은 acceptEx를 쓰기 때문에 미리 유저 정보와 소켓등을 할당해둔다.
* Accept/Recv/Send 등의 처리가 끝나서 CompletionThread 에 위치한 GetQueuedCompletionStatus 함수가 리턴되면, 최소한의 분류를 통해 유저 정보 내부에 State 를 정해주고, 실질적인 정보 처리를 위해, 따로 생성해둔 처리 리스트에 해당 유저 정보를 추가한다. 어차피 GetQueuedCompletionStatus 으로 얻어올 수 있는 건 유저 정보를 담고있는 주소값이기 때문에, 정보 처리 리스트란 결국 유저 정보의 주소값의 리스트... 말이 왜 이러냐ㅜㅜ
* 서버 구현 단에서는 RunEvent라는 함수를 메인루프에 돌려주면 되는데, 이 RunEvent는 위에서 언급한 정보처리 리스트에 값이 존재할 경우 처리하는 역할을 한다. CompletionThread 에서의 처리를 최소화 하는 이유는, 빨리 처리해버리고 다른 결과값을 받아야 하기 때문에..!
* 이 CompletionThread와 RunEvent와의 관계는 클라이언트 사이드에서도 동일하게 가져감.
* 약간의 고민스러운 점이 있는데, 처리해야할 데이터가 RunEvent 내에 있다면 RunEvent의 실행 자체가 좀 무거워진다는 점 정도... 개선이 필요함.
* 헤헤... 멀티 쓰레드를 쓰는데 동기화 문제를 그닥 고려하지 않았다. 실제 게임 서버를 제작한다면 분명히 문제가 될거다. 그래도 아는 선에서 줄여보고자 IO처리 리스트를 별도로 두긴 했다만.. 운이 나쁠 경우, 문제가 될 여지가 확실히 있다.
3. 클라사이드
* CreateClientSocket 함수를 호출하면 서버와 마찬가지로 필요한 것들이 구성이 됨.
* Accept는 클라에선 안쓰니까 Recv/Send 처리는 서버와 거의 흡사. 다만 WSASend를 래핑한 함수를 사용할 때에는 소켓을 따로 받지 않는다.
* CompletionThread 를 1개만 생성함.
4. 기타
* Create~Socket 함수 호출시에는 이미 할당해둔 ListenSocket이 존재하면 걍 아무짓도 못하고 함수 맨 처음에 리턴해버리도록 함.
* 서버는 Socket 을 key 값으로 쓰도록 유도함. 예전에 이벤트 방식을 썼을때는 접속 순서대로 index 값을 줘서 키 값으로 쓰게 했는데.. 아무래도 불안정하기도 하고... 뭐. 다만 Socket의 경우 미리 전부 할당되어있는데, 클라가 연결된 소켓의 경우는 State가 RECV 상태이기 때문에 접속 여부를 구분할 수 있음. 접속 종료된 클라이언트는 소켓을 비롯한 객체를 한번 정리하고 재사용할 수 있도록 초기화한다음에 다시 AcceptEx함수를 호출해서 대기 상태로 둔다.
* 서버단에는, 라이브러리 단에서 사용하는 구조체를 직접적으로 전달하지 않고 따로 소켓,버퍼,접속상태 등만 존재하는 간단한 구조체로 바꿔서 전달. 서버단에서 바꾸지 말아야 할 정보를 바꿀 수 있기 때문에 보호 차원에서... 해두긴 했는데 별로 쓸데는 없을 거 같다. 근데 내가 나중에 미친 짓을 할 수도 있으니까.
5. 앞으로 해야할 것
* 머릿속에 제멋대로 얽혀있는 정보들을 정리
* 코드도 좀 정리... 예전에 학생때는 깔끔하게 잘 정리해가며 코딩했던 것 같은데 회사 몇년 다니고 나서 그런지 아니면 그냥 귀찮아진건지.. 아마 후자겠지만...아무튼 따로 정리할 시간이 필요할 정도로 지져분해져가.....
* 실제 게임 서버/클라 제작해가며 문제점 찾고 해결하기.
해결.. 하니까 생각난건데 코딩하다 뭔가 문제가 안풀리면 이제 트레이서에게 기도를 해야겠다. 그러면 어디선가 나타나서 안녕? 해결사가 왔어! 라고 말하고 해결해주....진 않겠지... ㅠㅠ 엉엉 트레이서언니.. 하나도 해결해주지 못할거면 저리가...ㅠㅠ 제발 오지마.. 막 이리저리 뛰댕기면서 힐해달라하면 어쩌라는거야ㅜㅜㅜ
'스터디 > Server' 카테고리의 다른 글
VagrantBox + CentOS+ Ruby on Rails (0) | 2019.03.20 |
---|---|
IOCP - ServerSide (0) | 2016.07.13 |
AcceptEX 개객기야 (0) | 2016.07.05 |
일단 IOCP 채팅서버 만드는 건 끝! (0) | 2016.06.28 |
Overlapped IO 모델 (0) | 2016.05.27 |