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() 함수를 호출