public async Task <bool> OnHandle(MessageContext context, NotifyP2PHolepunchSuccessMessage message)
        {
            var session = context.Session;

            session.Logger.Debug("NotifyP2PHolepunchSuccess {@Message}", message);
            var group = session.P2PGroup;

            if (session.HostId != message.A && session.HostId != message.B)
            {
                return(true);
            }

            var remotePeerA = group.GetMemberInternal(message.A);
            var remotePeerB = group.GetMemberInternal(message.B);

            if (remotePeerA == null || remotePeerB == null)
            {
                return(true);
            }

            var stateA = remotePeerA.ConnectionStates.GetValueOrDefault(remotePeerB.HostId);
            var stateB = remotePeerB.ConnectionStates.GetValueOrDefault(remotePeerA.HostId);

            if (stateA == null || stateB == null)
            {
                return(true);
            }

            if (session.HostId == remotePeerA.HostId)
            {
                stateA.HolepunchSuccess = true;
            }
            else if (session.HostId == remotePeerB.HostId)
            {
                stateB.HolepunchSuccess = true;
            }

            if (stateA.HolepunchSuccess && stateB.HolepunchSuccess)
            {
                var notify = new NotifyDirectP2PEstablishMessage(message.A, message.B, message.ABSendAddr,
                                                                 message.ABRecvAddr,
                                                                 message.BASendAddr, message.BARecvAddr);

                remotePeerA.Send(notify);
                remotePeerB.Send(notify);

                stateA.RetryCount = 0;
                stateB.RetryCount = 0;
            }

            return(true);
        }
Example #2
0
        public void NotifyP2PHolepunchSuccess(ProudSession session, NotifyP2PHolepunchSuccessMessage message)
        {
            session.Logger?.Debug("NotifyP2PHolepunchSuccess {@Message}", message);
            var group = session.P2PGroup;

            if (group == null || (session.HostId != message.A && session.HostId != message.B))
            {
                return;
            }

            var remotePeerA = group.Members?.GetValueOrDefault(message.A);
            var remotePeerB = group.Members?.GetValueOrDefault(message.B);

            if (remotePeerA == null || remotePeerB == null)
            {
                return;
            }

            var stateA = remotePeerA.ConnectionStates?.GetValueOrDefault(remotePeerB.HostId);
            var stateB = remotePeerB.ConnectionStates?.GetValueOrDefault(remotePeerA.HostId);

            if (stateA == null || stateB == null)
            {
                return;
            }

            //using (remotePeerA._sync.Lock())
            {
                //using (remotePeerB._sync.Lock())
                {
                    if (session.HostId == remotePeerA.HostId)
                    {
                        stateA.HolepunchSuccess = true;
                    }
                    else if (session.HostId == remotePeerB.HostId)
                    {
                        stateB.HolepunchSuccess = true;
                    }

                    if (stateA.HolepunchSuccess || stateB.HolepunchSuccess)
                    {
                        var notify = new NotifyDirectP2PEstablishMessage(message.A, message.B, message.ABSendAddr, message.ABRecvAddr, message.BASendAddr, message.BARecvAddr);
                        remotePeerA.SendAsync(notify);
                        remotePeerB.SendAsync(notify);
                    }
                }
            }
        }
        public void NotifyP2PHolepunchSuccess(ProudSession session, NotifyP2PHolepunchSuccessMessage message)
        {
            var group = session.P2PGroup;

            if (group == null || (session.HostId != message.A && session.HostId != message.B))
            {
                return;
            }

            var remotePeerA = (ServerRemotePeer)group.Members.GetValueOrDefault(message.A);
            var remotePeerB = (ServerRemotePeer)group.Members.GetValueOrDefault(message.B);

            if (remotePeerA == null || remotePeerB == null)
            {
                return;
            }

            var stateA = remotePeerA.ConnectionStates.GetValueOrDefault(remotePeerB.HostId);
            var stateB = remotePeerB.ConnectionStates.GetValueOrDefault(remotePeerA.HostId);

            if (stateA == null || stateB == null)
            {
                return;
            }

            if (session.HostId == remotePeerA.HostId)
            {
                stateA.HolepunchSuccess = true;
            }
            else if (session.HostId == remotePeerB.HostId)
            {
                stateB.HolepunchSuccess = true;
            }

            if (stateA.HolepunchSuccess && stateB.HolepunchSuccess)
            {
                var notify = new NotifyDirectP2PEstablishMessage(message.A, message.B, message.ABSendAddr, message.ABRecvAddr,
                                                                 message.BASendAddr, message.BARecvAddr);

                remotePeerA.Send(notify);
                remotePeerB.Send(notify);
            }
        }