7.5.1 EH 메신저 – FEndSVC 구현 [TCP/IP 소켓 프로그래밍 with 윈도우즈]

이제 FendSVC 부터 구현합시다. 서비스를 만들 때는 Win32 응용 프로젝트로 만들어 윈도우를 만들지 않으면 백 그라운드에서 동작하는 서비스를 만들 수 있습니다. 여기에서는 정상적으로 동작하는지 테스트하기 쉽게 콘솔 응용 프로젝트로 만들게요. EH 메신저 솔루션에 FendSVC 이름의 콘솔 응용 프로젝트를 만드세요.

FendSVC 프로젝트에 Program.cpp 파일을 추가하여 소스를 구현합시다.

필요한 동적 라이브러리를 참조합니다.

진입점 main 함수를 작성합시다.

윈속을 초기화합니다.

FendServer를 가동합니다.

윈속을 해제화합니다.

FendServer 가동 함수를 작성합시다.

TCP 서버를 생성합니다.

클라이언트 연결을 수락합니다.

클라이언트와의 통신을 위한 쓰레드를 생성하고 인자로 통신에 사용할 소켓을 전달합니다.

클라이언트와 통신하는 쓰레드 진입점 DoIt을 작성합시다.

쓰레드 인자로 전달받은 값을 소켓으로 형식 변환합니다.

FEndSVC는 Peer의 메시지를 수신하여 이를 비지니스 계층에게 전달하는 역할을 수행합니다. 따라서 Peer로부터 메시지를 수신합니다.

Peer로부터 받을 수 있는 메시지 종류는 5가지 입니다. 가입 요청, 탈퇴 요청, 로긴 요청, 로그 아웃 요청, KeepAlive 메시지가 있습니다. 메시지 종류에 따라 처리하는 함수를 호출합니다.

처리가 끝나면 소켓을 닫습니다.

가입 요청 메시지 처리 함수를 작성합시다.

정상적으로 동작하는지 확인하기 쉽게 수신한 메시지 종류를 출력합니다.

가입 요청 메시지는 가입 서비스에 전달해야 합니다. 따라서 가입 서버로 연결합니다.

수신한 패킷을 가입 서비스와 연결한 소켓으로 전달합니다.

가입 요청 시퀀스는 FEndSVC가 RegSVC에게 가입 요청 메시지를 보낸 후 응답 메시지를 수신해야 합니다.

가입 서비스와 연결한 소켓을 닫습니다.

가입 서비스에서 수신한 메시지를 Peer와 통신하는 소켓으로 전달합니다.

전달한 메시지 종류를 출력합니다.

탈퇴 요청 메시지 처리 함수를 작성합시다.

탈퇴 요청 메시지는 가입 서비스에게 전달합니다. 이를 위해 가입 서비스와 연결합니다.

탈퇴 요청 메시지를 가입 서비스와 연결한 소켓으로 전달합니다.

탈퇴 요청 시퀀스는 탈퇴 요청 메시지를 가입 서비스에게 전달만 합니다.

로긴 요청은 가입 요청과 비슷합니다. 차이가 있는 부분은 연결하여 전달할 서비스만 다릅니다. 로그 아웃 요청과 KeepAlive는 탈퇴 요청과 비슷합니다.

단위 테스트를 위해 테스트 프로젝트를 만듭시다. 테스트를 위해 더미 Peer 프로젝트와 더미 서비스 프로젝트를 만들어서 테스트할게요.

더미 Peer 프로젝트에 Program.cpp 소스 파일을 추가하세요. 여기서는 간단한 원리만 소개할게요.

여기에서는 로긴 요청 시퀀스만 테스트할게요.

진입점 main 함수를 작성합시다.

윈속을 초기화합니다.

더미 Peer를 가동합니다.

윈속을 해제화합니다.

더미 Peer를 가동하는 함수를 작성합시다.

여기에서는 로긴 요청 메시지를 전송하여 수신하는 테스트를 할게요.

FEndSVC에 연결합니다.

로긴 요청 메시지를 전송합니다.

로긴 요청 시퀀스에서는 응답을 수신합니다.

응답을 수신한 후에 소켓을 닫습니다.

수신한 메시지 아이디가 로긴 요청 응답이 맞는지 확인합니다.

로긴 요청 응답이 맞다면 이를 출력합니다.

그리고 결과가 무엇인지 확인하기 위해 로긴 요청 응답 메시지 형식으로 변환합니다.

로긴 요청 응답 결과를 출력합니다.

로긴 요청 응답 메시지가 아니면 오류를 출력합니다.

더미 서비스 프로젝트에 Program.cpp 파일을 추가하여 테스트 로직을 작성합시다.

여기에서는 로긴 요청에 관한 테스트만 진행할 것입니다.

진입점 main에서는 더미 서버를 가동합니다.

더미 서버 가동 함수에서는 FEndSVC 가동 함수와 비슷합니다. 여기에서는 로긴 요청 시퀀스를 테스트할 것이므로 로그 서비스 서버를 가동하는 형태로 작성합니다.

처리하는 쓰레드 진입점 함수를 작성합시다.

쓰레드 인자로 전달받은 값을 소켓 형식으로 변환합니다.

먼저 메시지를 수신합니다.

수신한 메시지가 로긴 요청인지 확인합니다.

로긴 요청이 맞다면 로긴 요청 메시지 형식으로 변환합니다.

수신한 정보를 확인합니다.

로긴 요청 응답 메시지를 생성합니다.

로긴 요청 응답 메시지를 전송합니다.

수신한 메시지가 로긴 요청 메시지가 아니면 오류를 출력합니다.

여기서는 간단하게 단위 테스트를 위한 프로젝트를 만드는 원리만 소개하였습니다.

[그림 7.19] FEndSVC 테스트 결과화면
[그림 7.19] FEndSVC 테스트 결과화면