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