Exemple #1
0
        internal Task ProcessAndSendMessage(MessageEventArgs e, EncryptContext context)
        {
            var         message     = (ProudMessage)e.Message;
            var         data        = message.ToArray();
            CoreMessage coreMessage = new RmiMessage(data);

            if (message.Compress)
            {
                data        = coreMessage.ToArray();
                coreMessage = new CompressedMessage(data.Length, data.CompressZLib());
            }

            if (message.Encrypt)
            {
                data = coreMessage.ToArray();
                using (var w = new PooledMemoryStream(Service.ArrayPool).ToBinaryWriter(false))
                {
                    w.Write(context.EncryptCounter);
                    w.Write(data);

                    data = w.ToArray();
                }

                data        = context.Encrypt(data);
                coreMessage = new EncryptedReliableMessage(data);
            }

            e.Message = coreMessage;
            return(base.OnSendMessage(e));
        }
 public ServerRemotePeer(IP2PGroup @group, uint hostId, bool directP2PAllowed, EncryptContext encryptContext)
 {
     Group            = @group;
     HostId           = hostId;
     DirectP2PAllowed = directP2PAllowed;
     EncryptContext   = encryptContext;
     ConnectionStates = new ConcurrentDictionary <uint, P2PConnectionState>();
 }
        public void Join(uint hostId, bool directP2P)
        {
            var            encrypted      = Filter.Config.EnableP2PEncryptedMessaging;
            EncryptContext encryptContext = null;

            if (encrypted)
            {
                encryptContext = new EncryptContext(Filter.Config.EncryptedMessageKeyLength);
            }

            var remotePeer = new ServerRemotePeer(this, hostId, directP2P, encryptContext);

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

            var session = _filter.SessionLookupByHostId.GetValueOrDefault(hostId);

            if (session != null)
            {
                session.P2PGroup = this;

                if (encrypted)
                {
                    session.Send(new P2PGroup_MemberJoinMessage(HostId, hostId, 0, encryptContext.RC4.Key, directP2P));
                }
                else
                {
                    session.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, 0, directP2P));
                }
            }

            foreach (var member in _members.Values.Where(member => member.HostId != hostId).Cast <ServerRemotePeer>())
            {
                var memberSession = _filter.SessionLookupByHostId.GetValueOrDefault(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?.Send(new P2PGroup_MemberJoinMessage(HostId, hostId, stateB.EventId, encryptContext.RC4.Key, directP2P));
                    session?.Send(new P2PGroup_MemberJoinMessage(HostId, member.HostId, stateA.EventId, member.EncryptContext.RC4.Key, directP2P));
                }
                else
                {
                    memberSession?.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, hostId, stateB.EventId, directP2P));
                    session?.Send(new P2PGroup_MemberJoin_UnencryptedMessage(HostId, member.HostId, stateA.EventId, directP2P));
                }
            }
        }
        public override void Close()
        {
            Send(new ShutdownTcpAckMessage());

            base.Close();

            if (EncryptContext != null)
            {
                EncryptContext.Dispose();
                EncryptContext = null;
            }

            ReadyEvent.Reset();
        }