Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень ограниченным набором "включённых служб" и доступных ресурсов, работающих на embedded Linuxе через локальную сеть.Решил сделать это с помощью сокетов в С с TCP/IP.
Запрашиваю время с помощью:time_t stime;
stime=htonl( (long)time( NULL )+2208988800UL );//персчитываю время на базис 1.1.1990
write( client, &stime, sizeof( stime ));Получаю с помощью:
read(sd, &stime, sizeof( stime ));//для упрощения привожу код без проверок
stime = ntohl( stime ) - 2208988800UL;
printf( "%s", ctime( &stime ) );Вопрос теперь в том, как мне записать это время в системное время на локальных машинах?!
>
>Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень
>ограниченным набором "включённых служб" и доступных ресурсов, работающих на embedded Linuxе
>через локальную сеть.
>
>Решил сделать это с помощью сокетов в С с TCP/IP.
>Запрашиваю время с помощью:Не учитывается время, потраченное на отправку, передачу, доставку и обработку пакетов -- а на не-realtime системах оно может быть значительным и достигать нескольких секунд. Таким образом вы очень сильно снижаете точность передаваемого времени.
Советую почитать спецификацию протокола NTP и написать минимально возможную реализацию. Хотя наверное проще будет взять готовый клиент NTP: на моей системе /usr/sbin/ntpdate занимает всего 45 килобайт -- не очень это и много даже для embedded-реализации.
>Вопрос теперь в том, как мне записать это время в системное время
>на локальных машинах?!man stime, но очень советую обратить внимание на NTP.
>
>Не учитывается время, потраченное на отправку, передачу, доставку и обработку пакетов --
>а на не-realtime системах оно может быть значительным и достигать нескольких
>секунд. Таким образом вы очень сильно снижаете точность передаваемого времени.Система с RTPreemt патчем, поэтому обработка будет занимать не сильно большое время,- думаю максимум - миллисекунды. Пересылка тоже сьест некоторое время, - но для меня самое главное сейчас не идеально установленное время, а синхронизированное,причём даже не с Ноутбуком, а между машинами; так как машины имеют абсолютно одинаковую систему и находятся на одинаковом удалении от Ноута я рассчитываю таким образом на разницу в несколько микросекунд между машинами, что на данном этапе подходит.
>Советую почитать спецификацию протокола NTP и написать минимально возможную реализацию. Хотя
>наверное проще будет взять готовый клиент NTP: на моей системе /usr/sbin/ntpdate
>занимает всего 45 килобайт -- не очень это и много даже
>для embedded-реализации.Какой адрес имеет Ваша система? Мне при этом полагаю потребуется также NTP-Сервер для ноутбука программить или скопировать где-то,- так как выхода в интернет из локальной сетки не предусмотрено?
>man stime, но очень советую обратить внимание на NTP.
Большое спасибо, сейчас посмотрю.
>Система с RTPreemt патчем, поэтому обработка будет занимать не сильно большое время,-
>думаю максимум - миллисекунды.Я не знаком с realtime вживую, но насколько я знаю, этот патч просто обеспечит preemptible ядро. То есть ваша программа получит управление как только можно быстрее, но обработка пакета внутри ядра ведь не ускорится. Хотя да, это миллисекунды даже и без realtime.
>Пересылка тоже сьест некоторое время, - но
>для меня самое главное сейчас не идеально установленное время, а синхронизированное,причём
>даже не с Ноутбуком, а между машинами; так как машины имеют
>абсолютно одинаковую систему и находятся на одинаковом удалении от Ноута я
>рассчитываю таким образом на разницу в несколько микросекунд между машинами, что
>на данном этапе подходит.Если вы синхронизируете время между одинаковыми машинами, то ведь и отставать/спешить эти машины будут одинаково. Поэтому я вижу мало смысла в такой пиринговой синхронизации для получения точного времени. Хотя всё зависит от задачи -- если главное чтобы на всех машинах было одинаковое время, а какое -- да пусть хоть 90-й год, тогда да, вы мыслите в правильном направлении.
>Какой адрес имеет Ваша система?
В смысле? Это мой домашний компьютер-десктоп. Полноценная система, но как видите -- NTP-клиент весит мало.
>Мне при этом полагаю потребуется также NTP-Сервер
>для ноутбука программить или скопировать где-то,- так как выхода в интернет
>из локальной сетки не предусмотрено?NTP-сервер уже написан под opensource лицензией. Можно синхронизироваться и с сервером в интернете, потому что NTP учитывает задержки на передачу пакетов, но для вашей задачи ИМХО, будет проблематично зависеть от сервера в интернете и самого соединения с интернетом. Поэтому NTP-сервер без проблем можно поставить на ноутбук, всё равно на ноутбуке будет стоять какая-то прога, отдающая время клиентам.
>Если вы синхронизируете время между одинаковыми машинами, то ведь и отставать/спешить эти
>машины будут одинаково. Поэтому я вижу мало смысла в такой
>пиринговой синхронизации для получения точного времени. Хотя всё зависит от
>задачи -- если главное чтобы на всех машинах было одинаковое время,
>а какое -- да пусть хоть 90-й год, тогда да, вы
>мыслите в правильном направлении.Именно такая задача и стоит сейчас,- точность соответствия времени нынешнему для меня не решаюшая.
>В смысле? Это мой домашний компьютер-десктоп. Полноценная система, но как видите
>-- NTP-клиент весит мало.Я Вас неправильно понял поначалу,- сори. Сейчас почитал доку по НТП и понимаю больше, спасибо большое за совет!
>[оверквотинг удален]
>Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень
>ограниченным набором "включённых служб" и доступных ресурсов, работающих на embedded Linuxе
>через локальную сеть.
>
>Решил сделать это с помощью сокетов в С с TCP/IP.
>Запрашиваю время с помощью:
>
>time_t stime;
>stime=htonl( (long)time( NULL )+2208988800UL );//персчитываю время на базис 1.1.1990
>write( client, &stime, sizeof( stime ));ээээ...
32bit arch: sizeof(time_t) = 4 (bytes)
64bit arch: sizeof(time_t) = 8 (bytes)long может быть и 32 и 64 бита в зависимости от платформы..
http://www-128.ibm.com/developerworks/ru/library/l-port64/in...как уже и рекомендовали - используйте NTP.
>ээээ...
>
>32bit arch: sizeof(time_t) = 4 (bytes)
>64bit arch: sizeof(time_t) = 8 (bytes)
>
>long может быть и 32 и 64 бита в зависимости от платформы..
>
>http://www-128.ibm.com/developerworks/ru/library/l-port64/in...
>
>как уже и рекомендовали - используйте NTP.У меня машины с 32 битовыми процессорами.
Я уже посмотрел НТП,- спасибо большое за совет, надо будет теперь доустановить НТП-клиент на машинах и настроить НТП-сервер на ноуте.
>time_t stime;
>stime=htonl( (long)time( NULL )+2208988800UL );//персчитываю время на базис 1.1.1990
>write( client, &stime, sizeof( stime ));
>
>Получаю с помощью:
>read(sd, &stime, sizeof( stime ));//для упрощения привожу код без проверок
>stime = ntohl( stime ) - 2208988800UL;
>printf( "%s", ctime( &stime ) );советую сделать реализацию по udp и обрабатывать сигнал SIGIO в котором фиксировать время поступления пакета
зы: так работает ntp