public P2PConnectionState(IP2PMemberInternal remotePeer) { RemotePeer = remotePeer; EventId = (uint)Guid.NewGuid().GetHashCode(); }
public void Join(uint hostId) { var encrypted = _options.EnableP2PEncryptedMessaging; Crypt crypt = null; if (encrypted) { crypt = new Crypt(_options.EncryptedMessageKeyLength); } var sessionToJoin = _sessionManager.GetSession(hostId); IP2PMemberInternal memberToJoin = sessionToJoin; if (!_members.TryAdd(hostId, sessionToJoin)) { throw new ProudException($"Member {hostId} is already in P2PGroup {HostId}"); } _log.Debug("Client({HostId}) joined P2PGroup({GroupHostId})", hostId, HostId); sessionToJoin.P2PGroup = this; memberToJoin.Crypt = crypt; if (encrypted) { sessionToJoin.Send(new P2PGroup_MemberJoinMessage(HostId, hostId, 0, crypt.AES.Key, AllowDirectP2P)); } else { sessionToJoin.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, 0, AllowDirectP2P)); } foreach (var member in _members.Values.Where(member => member.HostId != hostId)) { var stateA = new P2PConnectionState(member); var stateB = new P2PConnectionState(sessionToJoin); memberToJoin.ConnectionStates[member.HostId] = stateA; member.ConnectionStates[memberToJoin.HostId] = stateB; if (encrypted) { member.Send(new P2PGroup_MemberJoinMessage(HostId, hostId, stateB.EventId, crypt.AES.Key, AllowDirectP2P)); sessionToJoin.Send( new P2PGroup_MemberJoinMessage( HostId, member.HostId, stateA.EventId, crypt.AES.Key, AllowDirectP2P ) ); } else { member.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, stateB.EventId, AllowDirectP2P)); sessionToJoin.Send( new P2PGroup_MemberJoin_UnencryptedMessage( HostId, member.HostId, stateA.EventId, AllowDirectP2P ) ); } } if (_options.AllowServerAsP2PGroupMember) { sessionToJoin.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, Constants.HostIdServer, 0, false)); } if (_options.ServerAsP2PGroupMemberHack) { sessionToJoin.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, Constants.HostIdServerHack, 0, false)); } }