7.4.3 EH 메신저 가입 라이브러리 설계 및 구현 [TCP/IP 소켓 프로그래밍 with 윈도우즈]

가입 서비스에서 제공하는 기능은 가입 요청과 탈퇴 요청입니다. 이 때 Peer와 가입 서버가 공통적으로 필요한 라이브러리를 설계 및 구현합시다.

[그림 7.15] 가입 관련 노드 컴포넌트 다이어그램
[그림 7.15] 가입 관련 노드 컴포넌트 다이어그램
 가입 관련 노드는 가입 요청 및 탈퇴 요청을 시도하는 Client와 가입 서버가 있습니다. Client에는 Peer 프로그램이 가입 라이브러리와 EHPacket 라이브러리를 사용하고 가입 라이브러리는 EHPacket 라이브러리를 사용합니다. 그리고 가입 서버는 RegSVC 프로그램이 가입 라이브러리와 EHPacket 라이브러리를 사용하고 가입 라이브러리는 EHPacket 라이브러리를 사용합니다.

이제 가입 라이브러리를 작성합시다. 가입 라이브러리는 RegLib 이름으로 만들게요. 가입 라이브러리에는 가입 요청하는 RegReq 클래스와 RegReponse 클래스, 탈퇴 요청하는 UnRegReq 클래스로 구성할게요.

먼저 EH 메신저 솔루션에 RegLib 이름으로 Win2 프로젝트를 추가하고 DLL 형태로 만드세요.

아키텍쳐링 단계에서 정의한 메시지 종류를 구분하기 위한 메시지 아이디를 정의할 헤더 파일을 Common 프로젝트에 추가합니다. 헤더 파일 이름은 ehmsg.h 라고 정할게요.

가입 관련 메시지 아이디를 정의합시다.

로긴 관련 메시지 아이디를 정의합시다.

상태 관련 메시지 아이디를 정의합시다.

데이터 계층 관련 메시지 아이디를 정의합시다.

서비스에서 사용할 포트를 정의합시다.

가입 라이브러리에는 가입 요청 메시지와 가입 요청 응답 메시지, 탈퇴 요청 메세지를 정의할 것입니다. 이들에서 공통으로 포함해서 사용할 Reg.h 파일을 Common 프로젝트에 추가합니다.

EHPacketLib를 사용해야 하므로 EHPacket.h 파일을 포함하고 EHPacketLib 파일을 참조 추가합니다.

가입 라이브러리 내부와 사용할 곳에 맞게 __declspec 표현을 할 수 있게 매크로 REG_DLL를 정의합니다.

그리고 가입 요청에 관한 클래스를 정의할 RegReq.h 파일을 Common 프로젝트에 추가합니다.

RegReq 클래스를 추가합니다.

가입 요청에는 아이디, 비밀 번호, 이름이 있어야 합니다.

가입 요청 메시지를 보내는 곳에서 사용할 생성자를 선언합니다.

받은 패킷을 가지고 RegReq 개체를 만드는 생성자를 선언합니다.

아이디와 이름, 비밀 번호를 반환하는 메서드를 선언합니다.

RegReq 메시지를 소켓으로 전송하는 메서드를 선언합니다.

RegLib 프로젝트에 RegReq.cpp 소스 파일을 추가합니다.

매크로 REG_DLL이 __declspec(dllexport) 표현으로 정의할 수 있도록 약속한 매크로를 정의합니다.

#define REG038IUPHDFJKDIFEWFKDSIFHWELKJFHOISUDFHK

RegReq 클래스를 정의한 헤더 파일과 메시지 아이디를 정의한 헤더 파일을 포함합니다.

가입 요청을 보내는 곳에서 사용할 생성자를 구현합시다.

입력 인자로 전달받은 값으로 멤버 필드를 설정합니다.

수신한 EHPacket으로 RegReq 개체를 만드는 생성자를 구현합시다.

id 길이를 얻어온 후에 id를 얻어옵니다.

같은 방법으로 비밀 번호와 이름을 얻어옵니다.

얻어온 값으로 멤버 필드를 설정합니다.

아이디와 이름 비밀 번호를 반환하는 메서드를 구현합시다.

소켓으로 전송하는 메서드를 구현합시다.

먼저 MID_REGREQ 아이디를 인자로 EHPacket을 생성합니다.

아이디 길이를 얻어온 후에 아이디 길이와 아이디를 패킷에 캡슐화합니다. 여기에서는 종료 문자를 포함하여 캡슐화하기 위해 아이디 길이를 1 더하였습니다.

비밀 번호와 이름도 같은 원리로 패킷에 캡슐화합니다.

패킷을 소켓으로 직렬화합니다. 참고로 직렬화란 프로세스의 데이터를 다른 물리 매체에 선형 방법으로 전달하는 것을 말합니다.

가입 요청의 응답인 RegResponse 메시지를 정의합시다. 먼저 common 프로젝트에 RegRes.h 파일을 추가합시다.

가입 요청의 결과는 성공과 실패 두 가지가 있습니다. 이를 매크로 상수로 정의합시다.

RegRes 클래스를 추가합니다.

RegRes 메시지에는 가입 요청 결과가 필요합니다.

가입 요청 결과를 보내는 곳에서 사용할 생성자를 선언합니다.

수신한 패킷으로 RegRes 개체를 생성하는 생성자를 선언합니다.

결과를 반환하는 메서드를 선언합니다.

소켓으로 메시지를 전송하는 메서드를 선언합니다.

RegLib 프로젝트에 RegRes.cpp 소스 파일을 추가하세요.

생성자를 구현합시다.

가입 요청 결과를 반환하는 메서드를 구현합시다.

가입 요청 결과를 소켓으로 직렬화하는 메서드를 구현합시다.

같은 원리로 탈퇴 요청 메시지도 작성합니다. 다음은 Common 프로젝트에 추가할 UnRegReq.h 파일의 내용입니다.

다음은 RegLib 프로젝트에 추가할 UnRegReq.cpp 파일의 내용입니다.