IOCP를 이용한 채팅서버 + 이종교배
제 네트워크 프로그래밍에 대해서 복습할 차원(?)으로
게임 회사에서 서버에 이용하는 여러 프로그래밍 기법(?)을 가능한 축약시켜
간단한 채팅서버를 만들었습니다.
제작시간 : 약2일 + alpha
사용툴 : Visual Studio 2010, MS-SQL 2012
복습 내용 : 네트워크 IOCP, 멀티 쓰레드 기법
TinyXML 보다 더 짧은 MSXML을 이용한 외부 변수 파싱
MS-SQL에 연결하기 위한 ADO COM을 사용, DB에 쿼리 던지기
게임 명령어 처리를 위한 함수포인터 disPatcher
C#과 이종 교배 (서버는 C++, 클라이언트는 C#)
결과 화면 입니다...
<--- 수정 2012-10-31 --->
역시 주말에 급조해서 만든 소스다 보니 버그가 좀 있었습니다.. orz..
어젯밤 겨우 고쳐서 다시 스크린 샷을 찍었습니다...
ㅁ 버그수정 사항
- 어느 클라가 /date. /time 같은 명령어로 에코서버 통신을 했다면, 그 이후 다른 클라이언트의 메시지를 1회 못받음.
- db 주소가 서버와 같지 않으면 db 접속 실패 (ip설정을 잘못 쳤네요 ㅠㅠ)
- 어떤 클라이언트에서 아무 텍스트도 안넣고 엔터 치면 서버가 다운... (포인터 검사 문제가...)
- 에러메시지 출력시 한글이 깨지는 문제... orz...
- 햇갈리는 변수명을 수정...
서버 프로그램
C++11을 많이 이용하려 했으나, auto 키워드 이외 lamda 같은거는 무리하게 넣지 않았습니다.
그래도 auto 때문에 iterator 를 상당히 단축시킬 수 있어서 코딩이 즐겁더군요 ^^
맨위의 DB 쿼리 에러는 멍청하게도 DB마이그레이션을 하지 않아서 생긴 에러 메시지 입니다.. ㅠㅠ
클라이언트 프로그램
사실 C#책에 예제로 있는 소스를 적당히 썻습니다만, 꽤 쓸만했습니다.
서버 만드는데 2일 걸렸지만, 이 클라이언트는 30분정도 끄적이니까 만들어 지네요.
(저 소스가 개행 포함해서 200라인도 안됩니다)
일반적으로 메시지를 보내면 접속된 모든 클라이언트에 같은 메시지를 보냅니다.
물론 그 메시지를 보낸 클라이언트를 제외하고 SendAll입니다.
별도로 /date, /time 같이 서버의 날짜와 시간은 에코서버퍼럼 해당 명령을 내린 클라에게만 메시지를 보냅니다.
어짜피 시간은 메시지 옆에 찍히는데 뭘 그런걸 만들었냐 하시면.... orz...
온라인 게임에서 중요한 각 패킷의 처리등을 구현하는 방식을 간략화 하다 보니 이렇게 됬습니다..
다음 프로젝트는.... 엄청 심플한 mmorpg나 요즘 유행하는 드래곤X라이 같은 서버를.....
그리고 다음번엔 서버도 C#으로 작성해 봐야 할거 같습니다.
이 정도의 간편성과 안정성이면, 속도가 조금 느려도 괜찮다는 생각이 드는군요.
Database 쿼리 실행 결과
원래 재대로 만들려면, Login 서버 등을 만들어서 이것저것 처리하고 그걸 DB에 넣어야 하지만....
그냥 심플하게 가려고 하다 보니 프로시져를 이용한 쿼리 실행과 결과 보기 정도로 마무리를 했습니다.