public Task <bool> OnHandle(MessageContext context, UnreliableRelay1Message message)
        {
            var session = context.Session;

            foreach (var destination in message.Destination.Where(id => id != session.HostId))
            {
                if (destination == Constants.HostIdServerHack)
                {
                    var decodedMessage = CoreMessageDecoder.Decode(_serializer, Unpooled.WrappedBuffer(message.Data));
                    context.ChannelHandlerContext.Handler.ChannelRead(context.ChannelHandlerContext, new MessageContext
                    {
                        ChannelHandlerContext = context.ChannelHandlerContext,
                        Session     = context.Session,
                        Message     = decodedMessage,
                        UdpEndPoint = context.UdpEndPoint
                    });
                    continue;
                }

                var target = session.P2PGroup?.GetMemberInternal(destination);
                target?.Send(new UnreliableRelay2Message(session.HostId, message.Data), true);
            }

            return(Task.FromResult(true));
        }
        public void UnreliableRelayHandler(ProudSession session, UnreliableRelay1Message message, MessageReceivedEventArgs e)
        {
            foreach (var destination in message.Destination.Where(id => id != session.HostId))
            {
                if (session.P2PGroup == null)
                {
                    Logger.Debug()
                    .Message("Client {0} in not a p2pgroup", session.HostId)
                    .Write();
                    return;
                }

                if (!session.P2PGroup.Members.ContainsKey(destination))
                {
                    Logger.Debug()
                    .Message("Client {0} trying to relay to non existant {1}", session.HostId, destination)
                    .Write();
                    return;
                }

                if (destination == 2)
                {
                    #region Hardcoded ServerMember

                    ProudCoreOpCode opCode;
                    byte[]          data;
                    using (var r = message.Data.ToBinaryReader())
                    {
                        opCode = r.ReadEnum <ProudCoreOpCode>();
                        data   = r.ReadToEnd();
                    }

                    if (opCode == ProudCoreOpCode.Rmi)
                    {
                        var core = new RmiMessage(data)
                        {
                            IsRelayed    = true,
                            SenderHostId = session.HostId,
                            TargetHostId = destination
                        };
                        e.Message = core;
                        _filter.OnMessageReceived(e);
                    }
                    else
                    {
                        throw new ProudException($"Invalid opCode {opCode}");
                    }

                    #endregion
                }
                else
                {
                    var target = _filter.SessionLookupByHostId.GetValueOrDefault(destination);
                    target?.Send(new UnreliableRelay2Message(session.HostId, message.Data));
                }
            }
        }
Example #3
0
        public void UnreliableRelayHandler(ProudSession session, UnreliableRelay1Message message)
        {
            foreach (var destination in message.Destination.Where(id => id != session.HostId))
            {
                if (session.P2PGroup == null)
                {
                    continue;
                }

                if (!session.P2PGroup.Members.ContainsKey(destination))
                {
                    continue;
                }

                var target = _server.Sessions.GetValueOrDefault(destination);
                target?.SendUdpIfAvailableAsync(new UnreliableRelay2Message(session.HostId, message.Data));
            }
        }
Example #4
0
        public void UnreliableRelayHandler(IChannel channel, ProudSession session, UnreliableRelay1Message message)
        {
            foreach (var destination in message.Destination.Where(id => id != session.HostId))
            {
                if (session.P2PGroup == null)
                {
                    //Logger<>.Debug($"Client {session.HostId} in not a p2pgroup");
                    return;
                }

                if (!session.P2PGroup.Members.ContainsKey(destination))
                {
                    //Logger<>.Debug($"Client {session.HostId} trying to relay to non existant {destination}");
                    return;
                }

                var target = _server.Sessions.GetValueOrDefault(destination);
                target?.SendUdpIfAvailableAsync(new UnreliableRelay2Message(session.HostId, message.Data));
            }
        }