示例#1
0
 public P2PConnectionState(IP2PMemberInternal remotePeer)
 {
     RemotePeer = remotePeer;
     EventId    = (uint)Guid.NewGuid().GetHashCode();
 }
示例#2
0
        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));
            }
        }