[Unreal] 23.서버
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
서버
서비스를 제공하는 소프트웨어가 실행되는 컴퓨터
스레드
프로세스를 여러 개의 조각으로 나눈 것, 프로세스는 하나 이상의 스레드로 이루어져 있다
- 언리얼은 기본적으로 멀티 스레드를 지원하고 두 개의 메인 스레드로 돌고 있다. 하나는 게임 스레드 이고 다른 하나는 렌더 스레드 이다
- 커스텀 Recieve Thread를 만들어서 동작시킬 예정
- PQ를 이용해서 언리얼 스레드와 커스텀 리시브 스레드를 연결할 것
- Queue에 패킷을 넣고 뺄 때, 동기화가 되게 끔 구현
네트워크 매니저
여러 개의 소켓을 관리하기 위함
소켓은 각 운영체제마다 사용하는 것이 달라질 수 있다
- 모듈 추가 : Networking, Sockets, HTTP, Json
GameInfo.h에 해더 추가- HTTP 통신을 할 수 있도록 Http 헤더도 추가 (모바일 기반 게임 통신이 주로 사용)
DefaultEngine.ini- HTTP 관련된 내용을 커스텀으로 추가할 수 있다
NetworkManager.cpp
여러 개의 소켓 관리를 위한 네트워크 매니저 클래스
NetworkManager클래스 생성 -> 싱글톤을 이용해 제작할 예정- 어떠한 클래스도 상속받지 않는 클래스이므로 메모리 관리를 직접 해주어야 한다
- 생성자
CNetworkManager- 싱글톤 클래스 생성 및 초기화
- 소멸자
~CNetworkManager - 맵으로 네크워크 세션들을 매핑한 후 저장한다
- 세션을 체크하는 함수
- 연결하는 함수
- 패킷 전송/받는 함수
- 세션을 찾는 함수
NetworkInfo.h
네트워크 정보를 담고 있는 헤더 파일
NetworkSession.h
언리얼 기능 중 네트워크 기능을 편하게 사용하기 위해 만든 커스텀 모듈
- NetworkManager와 friend 처리
- 멤버 변수
- 소켓 이름
- 생성된 소켓의 주소
- 연결 상태 boolean 값
- uint8 타입의 전송패킷, 수신패킷 배열
- 멤버 함수
Connect(const FString& IpAddr, int32 Port)Close()연결 해제- bool 타입 함수
Recieve(int32& PacketHeader, int32& Size, uint8* Packet)- 패킷헤더(이름표)에 데이터 사이즈를 알려주는 Size 변수를 전달하고, 실제 데이터는 Packet에 저장
- bool 타입 함수
Send(int32 PacketHeader, int32 Size, uint8* Packet)
NetworkSession.cpp
- PLATFORM_SOCKETSUBSYSTEM 다양한 플랫폼의 소켓 서브시스템을 받아와서 해당 되는(사용할) 소켓을 따로 만들 수 있다
- 연결 해제 시 소켓을 직접 삭제 해줘야 한다
- Receive
- 하나의 큰 데이터 패킷으로 온 것을 FMemory의 Memcpy 함수를 통해 내가 원하는 정보로 변환할 수 있다
void CNetworkSession::Connect(const FString& IpAddr, int32 Port)
{
mSocket = ISocketSubSystem::GET(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("Default"), false);
// 문자열로 들어 온 주소를 실제 주소로 만들어준다
FIPv4Address ip;
FIPv4Address::Parse(IPAddr, ip);
// IP와 Port를 합친 최종 주소를 만들어 준다
TSharedRef<FInternetAddr> Add = ISocketSubSystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
Addr->SetIP(ip.Value);
Addr->SetPort(Port);
mConnect = mSocket->Connect(*Addr);
return mConnect;
}
GameInstance.cpp
게임인스턴스를 활용해 네트워크 매니저 사용
언제 네트워크 매니저로 관리되는 채팅 소켓을 활성화 할 지가 중요
게임 선택 모드가 종료될 때, 채팅 서버를 연결할 예정
SelectGameMode.cpp
- [캐릭터 선택] - [SelectGameMode 제거] - [채팅 서버 연결]
SelectGameMode의EndPlay()함수를 재정의- NetworkManager 인스턴스 만들고
Connect() - 채팅 서버와 통신할 스레드를 생성한 후 연결한다
- ReceiveThread에서 사용할 Session을 넣어준다
- 스레드를 동작시킨다
- NetworkManager 인스턴스 만들고
과제
- 리스트, 스택, 큐 구현해보기