示例#1
0
        void OnTimeSyncResponse(IInOctetStream stream)
        {
            //log.Trace("On Time Sync response");

            if (state != ConnectionState.TimeSync)
            {
                if (useDebugLogging)
                {
                    log.Warning("We are not in timesync state anymore");
                }
                return;
            }
            var echoedTicks = stream.ReadUint64();
            var latency     = monotonicClock.NowMilliseconds() - (long)echoedTicks;
            // log.Trace($"Latency: {latency}");
            var remoteTicks = stream.ReadUint64();

            latencies.AddLatency((ushort)latency);
            ushort averageLatency;
            var    isStable = latencies.StableLatency(out averageLatency);

            if (isStable)
            {
                var remoteTimeIsNow = remoteTicks + averageLatency / (ulong)2;
                //log.Trace($"We are stable! latency:{averageLatency}");
                localMillisecondsToRemoteMilliseconds = (long)remoteTimeIsNow - monotonicClock.NowMilliseconds();
                latencies   = new LatencyCollection();
                ConnectedAt = monotonicClock.NowMilliseconds();
                SwitchState(ConnectionState.Connected, 100);
            }
            else
            {
                //log.Trace("Not stable yet, keep sending");
            }
        }
示例#2
0
        void ReadOOB(IInOctetStream stream, long packetTime)
        {
            var cmd = stream.ReadUint8();

            switch (cmd)
            {
            case CommandValues.ChallengeResponse:
                OnChallengeResponse(stream);
                break;

            case CommandValues.ConnectResponse:
                OnConnectResponse(stream);
                break;

            case CommandValues.TimeSyncResponse:
                OnTimeSyncResponse(stream);
                break;

            case CommandValues.PongResponse:
                OnPongResponse(stream, packetTime);
                break;

            default:
                throw new Exception($"Unknown command {cmd}");
            }
        }
        public static ChallengeResponse Deserialize(IInOctetStream stream)
        {
            var myNonce     = stream.ReadUint32();
            var serverNonce = stream.ReadUint32();

            return(new ChallengeResponse(myNonce, serverNonce));
        }
示例#4
0
        public static string Deserialize(IInOctetStream stream)
        {
            var myNonce    = stream.ReadUint8();
            var characters = stream.ReadOctets(myNonce);

            return(Encoding.UTF8.GetString(characters));
        }
示例#5
0
        SequenceId HandleTend(IInOctetStream stream, long packetTime)
        {
            var info = TendDeserializer.Deserialize(stream);

            if (useDebugLogging)
            {
                log.Debug($"received tend {info} ");
            }

            tendIn.ReceivedToUs(info.PacketId);
            var valid = tendOut.ReceivedByRemote(info.Header);

            if (valid)
            {
                PacketHistoryItem foundItem;
                var worked = timestampedHistory.ReceivedConfirmation(info.Header.SequenceId, out foundItem, log);
                if (worked)
                {
                    var latency     = packetTime - foundItem.Time;
                    var foundPacket = outStatsCollector.UpdateLatency((uint)info.Header.SequenceId.Value, latency);
                    if (!foundPacket)
                    {
                        log.Warning("didnt find latency to update", "sequenceID", info.Header.SequenceId.Value);
                    }

                    //simpleOut.AddLatency(latency);
                }
            }
            CallbackTend();

            return(info.PacketId);
        }
示例#6
0
        void OnPongResponse(IInOctetStream stream, long packetTime)
        {
            var pongResponse = PongResponseHeaderDeserializer.Deserialize(stream);

            OnPongResponseCmd(pongResponse);
            HandleTend(stream, packetTime);
        }
        public static NameVersion Deserialize(IInOctetStream stream)
        {
            var name = StringDeserializer.Deserialize(stream);

            var version = VersionDeserializer.Deserialize(stream);

            return(new NameVersion(name, version));
        }
示例#8
0
        void ReadConnectionPacket(IInOctetStream stream, long nowMs)
        {
            var packetId = HandleTend(stream, nowMs);
            var count    = stream.RemainingOctetCount;
            var payload  = stream.ReadOctets(count);

            incomingPacketBuffer.AddPacket(packetId, payload);
        }
 public static void Deserialize(IInOctetStream stream, ConnectInfo cmd)
 {
     cmd.BriskVersion       = NameVersionDeserializer.Deserialize(stream);
     cmd.SdkVersion         = NameVersionDeserializer.Deserialize(stream);
     cmd.SchemaVersion      = NameVersionDeserializer.Deserialize(stream);
     cmd.ApplicationVersion = NameVersionDeserializer.Deserialize(stream);
     cmd.Payload            = PayloadDeserializer.Deserialize(stream);
 }
示例#10
0
        public static ConnectResponse Deserialize(IInOctetStream stream)
        {
            var myNonce      = stream.ReadUint32();
            var serverNonce  = stream.ReadUint32();
            var connectionId = stream.ReadUint16();

            return(new ConnectResponse(myNonce, connectionId, serverNonce));
        }
示例#11
0
        public static CustomConnectPayload Deserialize(IInOctetStream stream)
        {
            var octetCount = stream.ReadUint8();
            var octets     = stream.ReadOctets(octetCount);

            return(new CustomConnectPayload {
                Payload = octets
            });
        }
        public static Version Deserialize(IInOctetStream stream)
        {
            var major = stream.ReadUint16();
            var minor = stream.ReadUint16();
            var patch = stream.ReadUint16();

            var prerelease = StringDeserializer.Deserialize(stream);

            return(new Version(major, minor, patch, prerelease));
        }
        public static Info Deserialize(IInOctetStream stream)
        {
            var packetSequenceId           = stream.ReadUint8();
            var receivedByRemoteSequenceId = stream.ReadUint8();
            var receiveMask = stream.ReadUint32();
            var header      = new Header(new SequenceId(receivedByRemoteSequenceId), new ReceiveMask(receiveMask));

            var info = new Info
            {
                PacketId = new SequenceId(packetSequenceId),
                Header   = header
            };

            return(info);
        }
示例#14
0
        void OnConnectResponse(IInOctetStream stream)
        {
            var response = ConnectResponseDeserializer.Deserialize(stream);

            if (useDebugLogging)
            {
                log.Debug($"We have a connection! {response}");
            }
            connectionId = response.ConnectionId;
            if (syncTimeOnConnect)
            {
                SwitchState(ConnectionState.TimeSync, connectedPeriodInMs);
            }
            else
            {
                ConnectedAt = monotonicClock.NowMilliseconds();
                SwitchState(ConnectionState.Connected, 100);
            }
        }
示例#15
0
        void OnChallengeResponse(IInOctetStream stream)
        {
            var response = ChallengeResponseHeaderDeserializer.Deserialize(stream);

            if (state != ConnectionState.Challenge)
            {
                return;
            }

            if (useDebugLogging)
            {
                log.Debug($"Challenge response {response}");
            }

            if (response.Nonce == challengeNonce)
            {
                remoteNonce = response.RemoteNonce;
                SwitchState(ConnectionState.ConnectRequest, 100);
            }
        }
示例#16
0
        void ReadHeader(IInOctetStream stream, byte mode, int packetOctetCount, long nowMs)
        {
            var sequence             = stream.ReadUint8();
            var assignedConnectionId = stream.ReadUint16();

            if (assignedConnectionId == 0)
            {
                ReadOOB(stream, nowMs);
            }
            else
            {
                if (assignedConnectionId == connectionId)
                {
                    var headerSequenceId = new SequenceId(sequence);

                    if (lastIncomingSequence.IsValidSuccessor(headerSequenceId))
                    {
                        var diff      = lastIncomingSequence.Distance(headerSequenceId);
                        var timeStamp = DateTime.UtcNow;
                        if (diff > 1)
                        {
                            inStatsCollector.PacketsDropped(timeStamp, diff - 1);
                        }
                        inStatsCollector.PacketReceived(timeStamp, packetOctetCount);
                        simpleIn.AddPacket(packetOctetCount);
                        lastIncomingSequence = headerSequenceId;

                        if (mode == OobMode)
                        {
                            ReadOOB(stream, nowMs);
                        }
                        else
                        {
                            ReadConnectionPacket(stream, nowMs);
                        }
                    }
                }
            }

            lastValidHeader = monotonicClock.NowMilliseconds();
        }
        public static PongResponseHeader Deserialize(IInOctetStream stream)
        {
            var elapsedMilliseconds = (long)stream.ReadUint64();

            return(new PongResponseHeader(elapsedMilliseconds));
        }