Page 1 sur 1

[DB-RS] Récupération heure NIST par Script en C#

Publié : 13 Oct 2019 09:23
par valentor
Bonjour à tous,
J'ai récemment trouvé cet article https://nickstips.wordpress.com/2010/02 ... rnet-time/
Je voudrais savoir si d'après vous il y aurais moyen d’adapter quelque chose de similaire pour unity, et si oui comment.
J'avoue ne pas comprendre grand chose au script, donc je ne comprends pas vraiment les erreurs qu'il me sort.

Merci d'avance :)
Je précise que nous avons déja testé la fonction utc native mais nous avons observés un écart trop important entre les heures envoyées par nos pc test, d'où l'intérêt de passer par un serveur tiers

Re: [DB-RS] Récupération heure NIST par Script en C#

Publié : 13 Oct 2019 10:09
par Alesk
C'est un code en C#, donc tu peux l'utiliser tel quel dans Unity.
Quelles sont les erreurs ?

Re: [DB-RS] Récupération heure NIST par Script en C#

Publié : 13 Oct 2019 10:31
par valentor
Voici deux screens des erreurs que j'obtiens
Image
Image

Re: [DB-RS] Récupération heure NIST par Script en C#

Publié : 13 Oct 2019 10:37
par Alesk
Bon, je pense que tes message d'erreur, ce sont juste les namespaces qui manquent en tout début de script.

J'ai l'ai testé (unity linux) et ça freeze unity lors de la connexion, j'ai pas capté pourquoi... Mais j'ai trouvé d'autres exemples qui font la même chose ici https://stackoverflow.com/questions/119 ... er-using-c

Et j'ai repris l'un des exemples pour faire ça :

Code : Tout sélectionner

using System;
using UnityEngine;
using System.Net;
using System.Net.Sockets;

public class NIST : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(GetNetworkTime(true));
    }

    public static DateTime GetNetworkTime(bool toLocalTime)
    {
        const string ntpServer = "pool.ntp.org";
        var ntpData = new byte[48];
        ntpData[0] = 0x1B; //LeapIndicator = 0 (no warning), VersionNum = 3 (IPv4 only), Mode = 3 (Client Mode)

        var addresses = Dns.GetHostEntry(ntpServer).AddressList;
        var ipEndPoint = new IPEndPoint(addresses[0], 123);
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        {
            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);

        if (toLocalTime)
        {
            return networkDateTime.ToLocalTime();
        }
        else
        {
            return networkDateTime;
        }
    }
}
Il y a un autre exemple qui tourne en asynchrone sur la page que je t'ai envoyée. Je pense que pour ce genre de chose ça serait pas mal de ne pas bloquer le thread principal, donc à creuser...