Beispiel #1
0
        public void P2PGroupMemberJoinAck(ProudSession session, P2PGroup_MemberJoin_AckMessage message)
        {
            session.Logger?.Debug("P2PGroupMemberJoinAck {@Message}", message);
            if (session.P2PGroup == null || session.HostId == message.AddedMemberHostId)
            {
                return;
            }

            var remotePeer = session.P2PGroup?.Members[session.HostId];

            if (remotePeer != null)
            {
                //using (remotePeer._sync.Lock())
                {
                    var stateA = remotePeer.ConnectionStates?.GetValueOrDefault(message.AddedMemberHostId);
                    if (stateA?.EventId != message.EventId)
                    {
                        return;
                    }

                    stateA.IsJoined = true;
                    var stateB = stateA.RemotePeer?.ConnectionStates?.GetValueOrDefault(session.HostId);
                    if (stateB?.IsJoined == true)
                    {
                        session.Logger?.Debug("Initialize P2P with {TargetHostId}", stateA.RemotePeer.HostId);
                        stateA.RemotePeer.Session.Logger?.Debug("Initialize P2P with {TargetHostId}", session.HostId);
                        stateA.LastHolepunch = stateB.LastHolepunch = DateTimeOffset.Now;
                        stateA.IsInitialized = stateB.IsInitialized = true;
                        remotePeer.SendAsync(new P2PRecycleCompleteMessage(stateA.RemotePeer.HostId));
                        stateA.RemotePeer?.SendAsync(new P2PRecycleCompleteMessage(session.HostId));
                    }
                }
            }
        }
        public void P2PGroupMemberJoinAck(ProudSession session, P2PGroup_MemberJoin_AckMessage message)
        {
            session.Logger?.Debug("P2PGroupMemberJoinAck {@Message}", message);
            if (session.P2PGroup == null || session.HostId == message.AddedMemberHostId)
            {
                return;
            }

            var remotePeer = session.P2PGroup?.Members[session.HostId];
            var stateA     = remotePeer?.ConnectionStates.GetValueOrDefault(message.AddedMemberHostId);

            if (stateA?.EventId != message.EventId)
            {
                return;
            }

            stateA.IsJoined = true;
            var stateB = stateA.RemotePeer.ConnectionStates.GetValueOrDefault(session.HostId);

            if (stateB?.IsJoined == true)
            {
                if (!session.P2PGroup.AllowDirectP2P)
                {
                    return;
                }

                // Do not try p2p when the udp relay is not used by one of the clients
                if (!stateA.RemotePeer.Session.UdpEnabled || !stateB.RemotePeer.Session.UdpEnabled)
                {
                    return;
                }

                session.Logger?.Debug("Initialize P2P with {TargetHostId}", stateA.RemotePeer.HostId);
                stateA.RemotePeer.Session.Logger?.Debug("Initialize P2P with {TargetHostId}", session.HostId);
                stateA.LastHolepunch = stateB.LastHolepunch = DateTimeOffset.Now;
                stateA.IsInitialized = stateB.IsInitialized = true;
                remotePeer.SendAsync(new P2PRecycleCompleteMessage(stateA.RemotePeer.HostId));
                stateA.RemotePeer.SendAsync(new P2PRecycleCompleteMessage(session.HostId));
            }
        }
        public void P2PGroupMemberJoinAck(ProudSession session, P2PGroup_MemberJoin_AckMessage message)
        {
            if (session.P2PGroup == null || session.HostId == message.AddedMemberHostId)
            {
                return;
            }

            var remotePeer      = session.P2PGroup?.Members[session.HostId];
            var connectionState = remotePeer?.ConnectionStates.GetValueOrDefault(message.AddedMemberHostId);

            if (connectionState?.EventId != message.EventId)
            {
                return;
            }

            connectionState.IsJoined = true;
            var connectionStateB = connectionState.RemotePeer.ConnectionStates[session.HostId];

            if (connectionStateB.IsJoined)
            {
                remotePeer.SendAsync(new P2PRecycleCompleteMessage(connectionState.RemotePeer.HostId));
                connectionState.RemotePeer.SendAsync(new P2PRecycleCompleteMessage(session.HostId));
            }
        }