天天看點

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

伺服器初始化InitListen

作為被動等待連接配接方,DS初始化時進入InitListen流程,綁定監聽位址。

綁定端口指定:

配置在BaseEngine.ini檔案URL節Port字段,引擎預設設定為7777。也可在啟動指令行URL參數中增加port附加參數, e.g. UE4Editor-Win64-Debug.exe demo.uproject /Game/Maps/MyLevel?port=8888 -server -log。

綁定IP指定:

預設綁定0.0.0.0,接收目标為主機任意IP的資料封包,可通過指令行參數multihome綁定到特定的本機IP。

DS自動選擇綁定端口機制:

當綁定指定的端口失敗時,DS會把目标端口+1,嘗試再次綁定,嘗試最大次數見配置字段MaxPortCountToTry(BaseEngine.ini檔案,/Script/OnlineSubsystemUtils.IpNetDriver節),引擎預設值是512。如果需要關閉自動選擇端口機制,将字段配置為0即可,在存在端口映射的環境中需要關注。

代碼參考調用堆棧:

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

用戶端初始化InitConnect

切換場景時,目标位址會被寫入FWorldContext:TravelURL。引擎Tick時檢查該内容如被設定,則建立UPendingNetGame臨時對象,進入InitConnect流程。建立到DS的連接配接對象ServerConnection,狀态為USOCK_Pending,并建立ControlChannel、VoiceChannel、ActorChannel。然後開始握手協定BeginHandshaking,進入握手流程。

代碼參考調用堆棧:

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

握手流程

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

握手完成後,開始調用BeginHandshaking時設定的回調函數

UPendingNetGame::SendInitialJoin,進入Join流程

參考代碼:

PacketHandler::BeginHandshaking

StatelessConnectHandlerComponent::Tick

StatelessConnectHandlerComponent::Incoming

StatelessConnectHandlerComponent::IncomingConnectionless

Join流程

# 再次嘗試 連接配接失敗_UE4網絡-用戶端與DS連接配接流程

參考代碼:

UPendingNetGame::LoadMapCompleted

UControlChannel::ReceivedBunch

UWorld::NotifyControlMessage