Esempio n. 1
0
        private static DateTime ComputeUtcResult(SNTPMessage sntpMessage, DateTime destinationTimestamp)
        {
            var originateSeconds = GetTotalSeconds(sntpMessage.OriginTimestamp.ByteArray);
            var receiveSeconds   = GetTotalSeconds(sntpMessage.ReceiveTimestamp.ByteArray);
            var transmitSeconds  = GetTotalSeconds(sntpMessage.TransmitTimestamp.ByteArray);

            var destinationSeconds = (destinationTimestamp - SNTPMessage.Era0).TotalSeconds;
            var offset             = 0.5 * (receiveSeconds - originateSeconds + transmitSeconds - destinationSeconds);

            return(destinationTimestamp.AddSeconds(offset));
        }
Esempio n. 2
0
        public static DateTime UtcRequest(Socket client, EndPoint serverAddress)
        {
            client.Connect(serverAddress);

            var firstMessage = new SNTPMessage(ModeType.ClientMode);

            client.Send(firstMessage.ResultMessage);

            var serverResponse = new byte[SNTPMessage.PackageBytesCount];

            client.Receive(serverResponse);

            var destinationTimestamp = DateTime.UtcNow;

            var secondMessage = new SNTPMessage(serverResponse);

            secondMessage.OriginTimestamp.ByteArray = firstMessage.OriginTimestamp.ByteArray;

            return(ComputeUtcResult(secondMessage, destinationTimestamp));
        }
Esempio n. 3
0
        public static void UtcReplay(Socket server, EndPoint remoteAddress, int secondsOffset, int receiveTimeout)
        {
            server.ReceiveTimeout = receiveTimeout;
            server.SendTimeout    = SendTimeout;

            var clientRequest = new byte[SNTPMessage.PackageBytesCount];

            server.ReceiveFrom(clientRequest, ref remoteAddress);

            var destinationTimestamp = DateTime.UtcNow;

            var serverReplay = new SNTPMessage(clientRequest)
            {
                Mode = ModeType.ServerMode
            };

            serverReplay.ReceiveTimestamp.ByteArray  = SNTPMessage.ConvertDateTimeToBytes(destinationTimestamp);
            serverReplay.TransmitTimestamp.ByteArray = SNTPMessage.ConvertDateTimeToBytes(
                DateTime.UtcNow.AddSeconds(secondsOffset));
            server.SendTo(serverReplay.ResultMessage, remoteAddress);
        }