Pobranie czasu z komputera w sieci lokalnej

Witajcie, stanąłem przed problemem określenia “czasu sieciowego” jako uśrednionego czasu rzeczywistego z kilku komputerów w sieci lokalnej. Zdaje mi się, że najprościej będzie to zrealizować poprzez protokół TIME (RFC 868), bo do zyskania takiego czasu wystarczy się połączyć z portem 37 czy wysłać pusty datagram. Tylko nasuwa mi się jeden podstawowy problem, pomiędzy poszczególnymi prośbami o udostępnienie timestampu może upłynąć jakiś czas który może wpłynąć na wynik pomiaru. Jedyny pomysł jaki mi przyszedł do głowy, to rejestrowanie na bieżąco różnic pomiędzy czasem pobranym a lokalnym, a następnie ich uśrednieniem i podanie ostatecznego rezultatu jako czas lokalny + średnia z różnic czasu.

A może w ogóle jest jakieś prostsze rozwiązanie którego nie zauważam?

Najprościej wyślij request dostań odpowiedź i policz czas między tymi zdarzeniami. Do otrzymanego w odpowiedzi czasu dodaj połowe czasu całej operacji. (Naukowo nazywa się to algorytm Cristiana - pogoogluj). Możesz oczywiści wysłać kilka requestów - wtedy najdokładniejszy będzie ten z najkrótszym okresem między pytaniem a odpowiedzią. Reszta dokładnie tak jak napisałes - średnia różnic. Pamiętaj tylko, że nie powinno się cofać czasu :slight_smile:

Co dokładniej masz na myśli? Jeżeli średnia różnic pobranych z komputerów w sieci okaże się mniejsza od zera (czyli np. zegar lokalny się śpieszy). To ostateczny wynik powinien być właśnie czasem lokalnym cofniętym o tę średnią różnic.

Dzięki wielkie za ten algorytm Crisiana :wink:

Ok, średni czas sieci taki będzie, ale jeśli chciałbyś np. później taki czas ustawić na wszystkich kompach (zsynchronizować zegary) to te, którym cofniesz czas mogą mieć dziwne problemy. (chociażby wariujący make i każde inne narzędzie, które opiera sprawdza czas modyfikacji plików).