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)); }
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)); }
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); }