Страница 1 из 1

Как повесить обработчик на NTP?

СообщениеДобавлено: 23.05.2021 19:51:16
VirtUX
Задача: вовремя среагировать на изменение системного времени, во время синхронизации его с NTP сервером.
Кроссплатформенно.

Re: Как повесить обработчик на NTP?

СообщениеДобавлено: 24.05.2021 13:54:20
olegy123
Проще самому получать время клиентом NTP и если нужно делать синхронизацию, посылать сообщения, SMS, Telegram-ить, выключать свет и запускать двигатели звездолета..
все это будет кроссплаторменно.

Re: Как повесить обработчик на NTP?

СообщениеДобавлено: 24.05.2021 14:42:08
VirtUX
Мне нужно отследить момент, когда ОС сама выполнит синхронизацию времени, или пользователь вручную это сделает, или какое стороннее приложение это сделает. Мне как раз ненужно, чтобы время НЕ менялось. И поэтому нужно успеть среагировать на изменение системного времени.

Параллельный вопрос:
Как реализовать собственный "стабильный" таймер, который не будет зависеть в течение одних-двух суток от любых изменений системного времени, и будет четко выдавать собственное время?
Запустил пользователь приложение. Включился собственный таймер. Синхронизировался с системным временем. Пользователь, стороннее ПО или ОС изменили системное время, а собственный таймер продолжает выдавать нужное время, как-будто время никто не менял. Постоянно синхронизировать его по NTP нельзя. Так как - это будет тоже самое, что и довериться ОС. Любое изменение времени между стартом приложения и текущим моментом - вызовет ошибку в расчетах. При этом постепенное отставание или опережение (в зависимости от железа ПК) реального времени - не вызовет ошибку в расчетах. Точность определения текущего времени = 1 миллисек.
Возможно решением будет использование GetTickCount. Но не уверен, что в течение 2 суток, он будет стабильно выдавать разницу между стартом приложения и текущим моментом...

Re: Как повесить обработчик на NTP?

СообщениеДобавлено: 24.05.2021 15:11:10
olegy123
VirtUX писал(а):Мне нужно отследить момент, когда ОС сама выполнит синхронизацию времени
OS это черный ящик, если есть внутри этого ящика подписка на событие изменения времени по NTP то ваша цель решена, разумеется каждая OS по своему думает.
погуглил есть у Windows событие WM_TIMECHANGE которое вызывается когда время изменяется.

VirtUX писал(а):Как реализовать собственный "стабильный" таймер... Пользователь, стороннее ПО или ОС изменили системное время, а собственный таймер продолжает выдавать нужное время, как-будто время никто не менял. Постоянно синхронизировать его по NTP нельзя.
Вы хакингом занимались? Там этот вопрос крайне остро стоит, хотя бы тем что можно целую OS посадить на VM через который может дебажить код взад и вперед. GetTickCount - это очень ненадежно.

Выходы только два: 1) это быть постоянно онлайн и клиента жестко контролировать, туда можно отнести сертификаты которые имеют свой срок жизни и требовать подтверждения легальности у всяких центров подтверждения, они точно имеют независимые часы, если сертификат исток, то при следующей проверки - они вам сообщат отрицанием подтверждения.
2) иметь аппаратные ключи, типа HASP. Они имеют на борту свои энергонезависимые часы, в них, в некоторых аппаратных ключах можно разместить даже свой код, который может чекать сессии.

Других вариантов нет.

Re: Как повесить обработчик на NTP?

СообщениеДобавлено: 24.05.2021 15:46:34
VirtUX
olegy123 писал(а):Windows событие WM_TIMECHANGE

Не кроссплатформенно. А CM_TIMECHANGE еще не реализовано, - ждём...
olegy123 писал(а):Вы хакингом занимались?

Нет. Бюджетными тайминговыми системами для соревнований.
olegy123 писал(а):2) иметь аппаратные ключи, типа HASP

Спасибо! Это вариант.

Re: Как повесить обработчик на NTP?

СообщениеДобавлено: 24.05.2021 16:43:36
olegy123
VirtUX писал(а):Не кроссплатформенно.
разумеется, что не кроссплатформенно. Но под каждую платформу можно заточить событие на изменение системных часов, в линуксе пишут нужно ловить TFD_TIMER_CANCEL_ON_SET в функции timerfd_settime

VirtUX писал(а):Спасибо! Это вариант.
если нужно "сделать сам" и подешевле то могу посоветовать смастерить донгл на базе STM32, в чипе есть внутренние часы 8Мгц (RC -резистор-конденсатор), можно закварцеровать, точность резко возрастет. стоимость ~100/300 рублей. Купить все детали можно в любом магазине радиокомпонентов.
Связь можно наладить по USB-UART(STM эмулирует линк UART(Com-порт) по USB, в Windows/Linux появится устройство Com-порт) и питание подвести 5в. И свой хитрый код зашить в этот ARM