public void Join(uint hostId)
        {
            var   encrypted = _server.Configuration.EnableP2PEncryptedMessaging;
            Crypt crypt     = null;

            if (encrypted)
            {
                crypt = new Crypt(_server.Configuration.EncryptedMessageKeyLength,
                                  _server.Configuration.FastEncryptedMessageKeyLength);
            }

            var session    = _server.Sessions[hostId];
            var remotePeer = new RemotePeer(this, session, crypt);

            if (!_members.TryAdd(hostId, remotePeer))
            {
                throw new ProudException($"Member {hostId} is already in P2PGroup {HostId}");
            }

            session.P2PGroup = this;

            if (encrypted)
            {
                session.SendAsync(new P2PGroup_MemberJoinMessage(HostId, hostId, 0, crypt.AES.Key, crypt.RC4.Key, AllowDirectP2P));
            }
            else
            {
                session.SendAsync(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, 0, AllowDirectP2P));
            }

            foreach (var member in _members.Values.Where(member => member.HostId != hostId).Cast <RemotePeer>())
            {
                var memberSession = _server.Sessions[member.HostId];

                var stateA = new P2PConnectionState(member);
                var stateB = new P2PConnectionState(remotePeer);

                remotePeer.ConnectionStates[member.HostId] = stateA;
                member.ConnectionStates[remotePeer.HostId] = stateB;
                if (encrypted)
                {
                    memberSession.SendAsync(new P2PGroup_MemberJoinMessage(HostId, hostId, stateB.EventId, crypt.AES.Key, crypt.RC4.Key, AllowDirectP2P));
                    session.SendAsync(new P2PGroup_MemberJoinMessage(HostId, member.HostId, stateA.EventId, crypt.AES.Key, member.Crypt.RC4.Key, AllowDirectP2P));
                }
                else
                {
                    memberSession.SendAsync(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, stateB.EventId, AllowDirectP2P));
                    session.SendAsync(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, member.HostId, stateA.EventId, AllowDirectP2P));
                }
            }
        }
Exemple #2
0
 public P2PConnectionState(RemotePeer remotePeer)
 {
     RemotePeer = remotePeer;
     EventId    = (uint)Guid.NewGuid().GetHashCode();
 }