36 - Netowrk, Multi Thread

Overcle·2023년 3월 23일
0

학원

목록 보기
29/29

Network Manager는 언리얼에 제공하는 클래스가 아닌 일반 클래스 이기때문에. 동적할당에 주의가 필요하다.

수업내용


이전 수업내용

Network Session, Network Manager, Netowrk Stream 클래스를 생성
부모클래스는 None,

Session은 연결확인과 보내고 받은지에 대한 관리.
Stream은 Buffer에 데이터를 Add, Get 관리
Manager는 여러개의 Session을 관리.

Netowrk Manager.


  1. Network Manager에, List든 Queue든 TMap으로든 Session을 가지고 있어야 한다.

  2. 해당 배열 Session에 연결된 상태의 Session이 있는지 체크 함수 필요

  3. 연결된 상태의 Session이 없다면 Connect, Close 함수 필요

  4. Data 주고 받는 함수 필요

  5. FindSession 특정 Session 찾기 필요

public:
	bool Init();
	bool CheckSession(const FString& Name);
	bool Connect(const FString& Name, const FString& IPAddr, int32 Port);
	bool Close(const FString& Name);
	bool Receive(const FString& Name, int32& PacketHeader, int32& Length, uint8* Packet);
	bool Send(const FString& Name, int32 PacketHeader, int32 Length, uint8* Packet);
	class CNetworkSession* FindSession(const FString& Name);

동적할당 해제


Network Manager는 일반 클래스이기 때문에.
소멸자에서, 할당해제를 해야한다.

방식은 Iterator방식과 auto& 방식이 있으며, auto& 풀어쓴게 Iterator이다

배열 추가

Add, emplace의 차이점은
임시개체 생성 유무 차이이며.
emplace가 생성을 안한다.

Init()

초기화는 Manager를 어디서 선언할지에 따라 다르게 구현해야한다.

수업에서는 GameInstace에서 진행한다.

GameInstance.cpp

#include "Network/NetworkManager.h"

UUE11GameInstance::~UUE11GameInstance()
{
	CNetworkManager::DestroyInst();
}

void UUE11GameInstance::Init()
{
	Super::Init();

	CNetowrkManager::GetInst()->Init();
}

Thread


  1. 일반 클래스 생성 "ReceiveThread"

  2. FRunnable 부모클래스 지정.

  3. PacketQueue 일반 클래스 생성

추 후 정리 예정

번외


모바일은 무슨 서버를 사용하는가?

모바일 게임의 경우 대부분은
c++서버를 사용하지 않고
node.js 서버를 사용한다.

이유는 모바일의 경우 게임을 하면서 이동할경우.
기지국이 계속 바뀌게 되는데.
c++ 의 TCP로 할경우에는 기지국이 바뀌는 순간 접속이 끊기는 상황이 자주 발생.

하지만 web서버는 필요할 경우에만 요청하기에 해당 사항이 발생하지 않기 때문에 발생할 확률이 낮다.

멀티쓰레드는 동일 참조 할 경우가 존재하기 때문에.
실무에서는 잘 사용하지 않을려고 한다.

동기화 Socket을 하게 된다면?

데이터를 서버에 보내면 서버는 전부 받을때까지 Blocking상태가 된다.
그러면 다받을때까지 멈추는 상황이 발생하기에.

멀티 쓰래드 방식을 채용한다.

profile
게임 프로그래머 지망생의 발자취

0개의 댓글