Как узнать реальное время в Unity 5 при помощи ntp сервера

В этом уроке мы разберем, как узнать реальное время в Unity 5 при помощи ntp сервера. Для того, чтоб получить реальное время нам необходимо подключиться к ntp серверу, лежащему в сети. Для этого создадим скрипт и назовем его TimeScript и сделаем в нем метод для получения времени из сети:

public static class TimeScript
{
    public static DateTime GetNetworkTime()
    {
        //Ссылка на наш ntp сервер
        const string ntpServer = "ntp.ix.ru";

        //Размер данных, получаемых от ntp сервера
        var ntpData = new byte[48];

        //выставляем Leap Indicator, Version Number and Mode values
        ntpData[0] = 0x1B; //LI = 0 (без предупреждений), VN = 3 (только IPv4), Mode = 3 (Клиент)
        
        //получаем адрес от днс сервера
        var addresses = Dns.GetHostEntry(ntpServer).AddressList;

        //Выставляем порт 123 для NTP 
        var ipEndPoint = new IPEndPoint(addresses[0], 123);

        
        using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
        {
            //Открываем подключение    
            socket.Connect(ipEndPoint);

            socket.ReceiveTimeout = 3000;
            //отсылваем запрос
            socket.Send(ntpData);

            //Получаем ответ
            socket.Receive(ntpData);
            socket.Close();
        }

        //Смещение для перехода в отсек с временем
        const byte serverReplyTime = 40;

        //получаем первую часть запроса и переводим биты в числа
        ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

        //Получаем следующую часть и переводим биты в числа
        ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

        //меняем порядок байтов big-endian в little-endian
        intPart = SwapEndianness(intPart);
        fractPart = SwapEndianness(fractPart);

        //получаем кол-во миллисекунд, прошедшее с 1900 года
        var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

        //переводим время в **UTC**
        var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);


        return networkDateTime.ToLocalTime();
    }

    static uint SwapEndianness(ulong x)
    {
        return (uint)(((x & 0x000000ff) << 24) +
                       ((x & 0x0000ff00) << 8) + ((x & 0x00ff0000) >> 8) +
                       ((x & 0xff000000) >> 24));
    }
}

Теперь при вызове метода GetNetworkTime мы будем получать данные с ntp сервера вот, что находится в выводе у меня:

Вывод данных с ntp сервера в Unity3d

Получение времени с сервера важно для того, чтоб избежать "Читерства " в вашей игре припомощи простого изменения времени на локальном телефоне. Но используя данный код вы лишаете возможности играть в вашу игру тех, у кого нет интернета.

Итак, в данном уроке мы разобрали как узнать реальное время в Unity 5 при помощи ntp сервера для избежания "читерства" при помощи изменения времени на телефоне.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Adblock
detector