Ejemplo n.º 1
0
        public static Result <NtpMessage> ParseFromBytes(byte[] bytes)
        {
            if (bytes.Length < MinMessageSizeInBytes || bytes.Length > MaxMessageSizeInBytes)
            {
                return(Result.Fail <NtpMessage>("Incorrect input data (should be more than 48 and less than 68)"));
            }

            var leapIndicator = (LeapIndicator)((bytes[0] & 0b11000000) >> 6);
            var versionNumber = (bytes[0] & 0b00111000) >> 3;
            var mode          = bytes[0] & 0b00000111;

            var stratum      = bytes[1];
            var pollInterver = bytes[2];
            var precision    = bytes[3];

            var rootDelay          = Converter.ToUInt32(bytes, 4);
            var rootDispersion     = Converter.ToUInt32(bytes, 8);
            var referenceId        = Converter.ToUInt32(bytes, 12);
            var referenceTimestamp = TimeStamp.ReadFromByteArray(bytes, 16);
            var originateTimestmap = TimeStamp.ReadFromByteArray(bytes, 24);
            var receiveTimestamp   = TimeStamp.ReadFromByteArray(bytes, 32);
            var transmitTimestamp  = TimeStamp.ReadFromByteArray(bytes, 40);
            var id     = bytes.Length > 48 ? Converter.ToUInt32(bytes, 48) : 0;
            var digest = bytes.Length > 48 ? BitConverter.ToString(bytes, 52) : "";

            var result = new NtpMessage
            {
                LeapIndicator      = leapIndicator,
                VersionNumber      = versionNumber,
                Mode               = mode,
                Stratum            = stratum,
                PollInterver       = pollInterver,
                Precision          = precision,
                RootDelay          = rootDelay,
                RootDispersion     = rootDispersion,
                ReferenceId        = referenceId,
                ReferenceTimestamp = referenceTimestamp,
                OriginateTimestmap = originateTimestmap,
                ReceiveTimestamp   = receiveTimestamp,
                TransmitTimestamp  = transmitTimestamp,
                Id     = id,
                Digest = digest
            };

            return(Result.Ok(result));
        }
Ejemplo n.º 2
0
        public static Result <NtpMessage> GenerateReplyFrom(NtpMessage ntpRequest, DateTime currentTime)
        {
            var receiveTimestamp = TimeStamp.FromDateTime(currentTime - StartTime);
            var result           = new NtpMessage
            {
                LeapIndicator      = LeapIndicator.NoWarning,
                VersionNumber      = ntpRequest.VersionNumber,
                Mode               = RequestMode,
                Stratum            = 1,
                PollInterver       = ntpRequest.PollInterver,
                Precision          = 0xe9,
                RootDelay          = 0,
                RootDispersion     = 0,
                ReferenceId        = BitConverter.ToUInt32(Encoding.UTF8.GetBytes("LOCL"), 0),
                ReceiveTimestamp   = receiveTimestamp,
                OriginateTimestmap = ntpRequest.TransmitTimestamp,
                ReferenceTimestamp = receiveTimestamp,
                TransmitTimestamp  = receiveTimestamp,
                Digest             = ""
            };

            return(Result.Ok(result));
        }