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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
valentor
Messages : 16
Inscription : 09 Août 2013 00:31

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

Message par valentor » 13 Oct 2019 09:23

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

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 13 Oct 2019 10:09

C'est un code en C#, donc tu peux l'utiliser tel quel dans Unity.
Quelles sont les erreurs ?

valentor
Messages : 16
Inscription : 09 Août 2013 00:31

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

Message par valentor » 13 Oct 2019 10:31

Voici deux screens des erreurs que j'obtiens
Image
Image

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 13 Oct 2019 10:37

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...

Répondre

Revenir vers « (C#) CSharp »