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); }
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); } }