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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

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

Сообщение VirtUX »

Задача: вовремя среагировать на изменение системного времени, во время синхронизации его с NTP сервером.
Кроссплатформенно.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Проще самому получать время клиентом NTP и если нужно делать синхронизацию, посылать сообщения, SMS, Telegram-ить, выключать свет и запускать двигатели звездолета..
все это будет кроссплаторменно.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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

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

Сообщение olegy123 »

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

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

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

Других вариантов нет.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

olegy123 писал(а):Windows событие WM_TIMECHANGE

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

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

Спасибо! Это вариант.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение 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
Ответить