天天看点

# 再次尝试 连接失败_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