服务器初始化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