伺服器初始化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即可,在存在端口映射的環境中需要關注。
代碼參考調用堆棧:
用戶端初始化InitConnect
切換場景時,目标位址會被寫入FWorldContext:TravelURL。引擎Tick時檢查該内容如被設定,則建立UPendingNetGame臨時對象,進入InitConnect流程。建立到DS的連接配接對象ServerConnection,狀态為USOCK_Pending,并建立ControlChannel、VoiceChannel、ActorChannel。然後開始握手協定BeginHandshaking,進入握手流程。
代碼參考調用堆棧:
握手流程
握手完成後,開始調用BeginHandshaking時設定的回調函數
UPendingNetGame::SendInitialJoin,進入Join流程
參考代碼:
PacketHandler::BeginHandshaking
StatelessConnectHandlerComponent::Tick
StatelessConnectHandlerComponent::Incoming
StatelessConnectHandlerComponent::IncomingConnectionless
Join流程
參考代碼:
UPendingNetGame::LoadMapCompleted
UControlChannel::ReceivedBunch
UWorld::NotifyControlMessage