Snippets

ömer faruk sayılır Unity Network Time Protocol Example

Created by Omer F. Sayilir last modified
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections;
using UnityEngine;
using System.Threading;

public class NetworkTimeProtocolExample : MonoBehaviour {
    
	void Start () {
        StartCoroutine(Request());
    }

    IEnumerator Request()
    {
        ThreatedJob<DateTime> tj = new ThreatedJob<DateTime>(GetNetworkTime, 2);
        yield return tj;
        Debug.Log(tj.data);
    }

    //Completely picked from http://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c
    public static DateTime GetNetworkTime()
    {
        const string ntpServer = "pool.ntp.org";
        var ntpData = new byte[48];
        ntpData[0] = 0x1B;

        var addresses = Dns.GetHostEntry(ntpServer).AddressList;
        var ipEndPoint = new IPEndPoint(addresses[0], 123);
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        socket.ReceiveTimeout = 3000;   
        socket.Connect(ipEndPoint);
        socket.Send(ntpData);
        socket.Receive(ntpData);
        socket.Close();

        ulong intPart = (ulong)ntpData[40] << 24 | (ulong)ntpData[41] << 16 | (ulong)ntpData[42] << 8 | (ulong)ntpData[43];
        ulong fractPart = (ulong)ntpData[44] << 24 | (ulong)ntpData[45] << 16 | (ulong)ntpData[46] << 8 | (ulong)ntpData[47];

        var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
        var networkDateTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds);

        return networkDateTime;
    }

}

public class ThreatedJob<T> : CustomYieldInstruction
{
    Thread thread;
    float abordTime;
    float endTime;
    bool started = false;
    public T data;

    public override bool keepWaiting
    {
        get
        {
            if (!started)
            {
                endTime = Time.unscaledTime + abordTime;
                started = true;
                thread.Start();
            }
            bool isTimeCompleted = Time.unscaledTime >= endTime;
            if (isTimeCompleted)
            {
                started = false;
                thread.Abort();
                return false;
            }
            return thread.IsAlive;
        }
    }

    public ThreatedJob(Func<T> job,float abordTime = 2)
    {
        this.abordTime = abordTime;
        ThreadStart thre = new ThreadStart(delegate {
            data = job.Invoke();
        });
        thread = new Thread(thre);
    }

}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.