Handshaking이란 Nework로 접속하는 두 컴퓨터가 잘 연결되었는지 확인하는 과정을 말한다.  언리얼 엔진의 네크워크 멀티플레이어 접속을 위한 Handshaking 과정을 학습하고 Client와 Server 간 Connection이 맺어지는 과정에 대해 알아보자.

 

 

 


 

 

[UE Net] Connection Handshaking

 

Client와 Server 간 Connection이 맺어지는 과정에 대해 알아보자.


 

Connection Handshaking

 

Handshaking이란?

Nework로 접속하는 두 컴퓨터가 잘 연결되었는지 확인하는 과정.  

 

 

UE Network Multiplayer 접속을 위한 Handshaking 과정

 


 

게임의 준비

 

Connection을 허용하면 게임을 시작할 수 있도록 Client와 Server는 준비 과정을 거침.

  • Client: 맵의 로딩
  • Server: Client를 대표하는 PlayerController 생성

 


 

Connection Handshaking의 확인

 

관련 소스코드 역할
 DataChannel.h Server와 Client가 통신하는데 사용하는 패킷들이 정의가 되어 있다. 
 UWorld::NotifyControlMessage ( Server ) 패킷을 처리하는 함수.
Server의 경우, UWorld::NotifyControlMessage 사용
 UPendingNetGame::NotifyControlMessage ( Client )  패킷을 처리하는 함수.
Client의 경우, UPendingNetGame::NotifyControlMessage 사용

패킷의 처리 콜스택 예시

 

-  패킷과 번치라는 개념을 통해 정보가 전달된다.


 

알아두면 좋은 UE Network System 구성

 

관련 소스코드

  •  NetDriver.h

 

용도에 따라 패킷을 처리하는 다양한 NetDriver 클래스를 제공함.

  •  GameNetDriver:  게임 데이터를처리하는데 사용하는 Network Driver
  •  DemoNetDriver:  게임 리플레이 데이터를처리하는데 사용하는 Network Driver
  •  BeaconNetDriver:  게임 외 데이터를 처리하는데 사용하는 Network Driver  

 

언리얼 엔진은 게임 데이터를 처리하는 게임넷드라이버로 IpNetDriver를 사용함.

 

초기 접속에 관련된 데이터 패킷을 ControlChannel을 통해 분석됨.

 

언리얼 엔진에서 번치(Bunch)를 처리하는데 사용하는 주요 채널

  •  ControlChannel:  Client-Server 간의 Connection을 다룰 때 사용하는 채널
  •  ActorChannel:  Actor Replication 작업을 다룰 때 사용하는 채널
  •  VoiceChannel:  음성 데이터를 전달할 때 사용  

 

 

 

코드로 살펴보는 실행과정

 

PendingNetGame.cpp

  • void UPendingNetGame::SendIntialJoin()
  • NMT_Hello

 

DataChannel.h

  • 번치(Bunch) 정보들

 

World.cpp

  • NMT_Hello

 

PendingNetGame.cpp

  • NMT_Challenge
  • NMT_Login
    • 로그인 시

 

GameMode.cpp

  • PreLogin

 

PendingNetGame.cpp

  • NMT_Welcome
  • NMT_Netspeed 패킷을 보냄

 

World.cpp

  • NMT_Netspeed
    • Connection의 현재 NetworkSpeed 값이 변경됨.

 

 

Client에서 맵이 로딩이 된다.

이 맵이 로딩이 되어서 모드가 완료되면

 

 

PendingNetGame.cpp

  • SendJoin() 함수가 호출됨.

 

World.cpp

  • NMT_Join
  • SpawnPlayActor

 

LevelActor.cpp

  • GameMode를 가져와서 Login() 함수를 통해서 PlayerController를 반환.
  • GameMode의 PostLogin() 함수를 호출