diff options
Diffstat (limited to 'Playground/Assets/ConsolePro/Remote/LiteNetLib/NtpSyncModule.cs')
-rw-r--r-- | Playground/Assets/ConsolePro/Remote/LiteNetLib/NtpSyncModule.cs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/Playground/Assets/ConsolePro/Remote/LiteNetLib/NtpSyncModule.cs b/Playground/Assets/ConsolePro/Remote/LiteNetLib/NtpSyncModule.cs new file mode 100644 index 0000000..83b5d86 --- /dev/null +++ b/Playground/Assets/ConsolePro/Remote/LiteNetLib/NtpSyncModule.cs @@ -0,0 +1,59 @@ +#if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA +using System; +using System.Threading; + +namespace FlyingWormConsole3.LiteNetLib +{ + public class NtpSyncModule + { + public DateTime? SyncedTime { get; private set; } + private readonly NetSocket _socket; + private readonly NetEndPoint _ntpEndPoint; + private readonly ManualResetEvent _waiter = new ManualResetEvent(false); + + public NtpSyncModule(string ntpServer) + { + _ntpEndPoint = new NetEndPoint(ntpServer, 123); + _socket = new NetSocket(OnMessageReceived); + _socket.Bind(0, false); + SyncedTime = null; + } + + private void OnMessageReceived(byte[] data, int length, int errorCode, NetEndPoint remoteEndPoint) + { + if (errorCode != 0) + { + _waiter.Set(); + return; + } + + ulong intPart = (ulong)data[40] << 24 | (ulong)data[41] << 16 | (ulong)data[42] << 8 | (ulong)data[43]; + ulong fractPart = (ulong)data[44] << 24 | (ulong)data[45] << 16 | (ulong)data[46] << 8 | (ulong)data[47]; + + var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L); + SyncedTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds); + + _waiter.Set(); + } + + public void GetNetworkTime() + { + if (SyncedTime != null) + return; + + var ntpData = new byte[48]; + //LeapIndicator = 0 (no warning) + //VersionNum = 3 + //Mode = 3 (Client Mode) + ntpData[0] = 0x1B; + + //send + int errorCode = 0; + _socket.SendTo(ntpData, 0, ntpData.Length, _ntpEndPoint, ref errorCode); + + if(errorCode == 0) + _waiter.WaitOne(1000); + } + } +} +#endif |