URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6631
[ Назад ]

Исходное сообщение
"Синхронизация времени"

Отправлено Gor , 26-Июл-07 23:21 

Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень ограниченным набором "включённых служб" и доступных ресурсов, работающих на 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 ) );

Вопрос теперь в том, как мне записать это время в системное время на локальных машинах?!


Содержание

Сообщения в этом обсуждении
"Синхронизация времени"
Отправлено anonymous , 27-Июл-07 05:15 
>
>Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень
>ограниченным набором "включённых служб" и доступных ресурсов, работающих на embedded Linuxе
>через локальную сеть.
>
>Решил сделать это с помощью сокетов в С с TCP/IP.
>Запрашиваю время с помощью:

Не учитывается время, потраченное на отправку, передачу, доставку и обработку пакетов -- а на не-realtime системах оно может быть значительным и достигать нескольких секунд.  Таким образом вы очень сильно снижаете точность передаваемого времени.

Советую почитать спецификацию протокола NTP и написать минимально возможную реализацию.  Хотя наверное проще будет взять готовый клиент NTP: на моей системе /usr/sbin/ntpdate занимает всего 45 килобайт -- не очень это и много даже для embedded-реализации.

>Вопрос теперь в том, как мне записать это время в системное время
>на локальных машинах?!

man stime, но очень советую обратить внимание на NTP.


"Синхронизация времени"
Отправлено Gor , 27-Июл-07 09:37 
>
>Не учитывается время, потраченное на отправку, передачу, доставку и обработку пакетов --
>а на не-realtime системах оно может быть значительным и достигать нескольких
>секунд.  Таким образом вы очень сильно снижаете точность передаваемого времени.

Система с RTPreemt патчем, поэтому обработка будет занимать не сильно большое время,- думаю максимум - миллисекунды. Пересылка тоже сьест некоторое время, - но для меня самое главное сейчас не идеально установленное время, а синхронизированное,причём даже не с Ноутбуком, а между машинами; так как машины имеют абсолютно одинаковую систему и находятся на одинаковом удалении от Ноута я рассчитываю таким образом на разницу в несколько микросекунд между машинами, что на данном этапе подходит.

>Советую почитать спецификацию протокола NTP и написать минимально возможную реализацию.  Хотя
>наверное проще будет взять готовый клиент NTP: на моей системе /usr/sbin/ntpdate
>занимает всего 45 килобайт -- не очень это и много даже
>для embedded-реализации.

Какой адрес имеет Ваша система? Мне при этом полагаю потребуется также NTP-Сервер для ноутбука программить или скопировать где-то,- так как выхода в интернет из локальной сетки не предусмотрено?

>man stime, но очень советую обратить внимание на NTP.

Большое спасибо, сейчас посмотрю.



"Синхронизация времени"
Отправлено anonymous , 27-Июл-07 15:34 
>Система с RTPreemt патчем, поэтому обработка будет занимать не сильно большое время,-
>думаю максимум - миллисекунды.

Я не знаком с realtime вживую, но насколько я знаю, этот патч просто обеспечит preemptible ядро.  То есть ваша программа получит управление как только можно быстрее, но обработка пакета внутри ядра ведь не ускорится.  Хотя да, это миллисекунды даже и без realtime.

>Пересылка тоже сьест некоторое время, - но
>для меня самое главное сейчас не идеально установленное время, а синхронизированное,причём
>даже не с Ноутбуком, а между машинами; так как машины имеют
>абсолютно одинаковую систему и находятся на одинаковом удалении от Ноута я
>рассчитываю таким образом на разницу в несколько микросекунд между машинами, что
>на данном этапе подходит.

Если вы синхронизируете время между одинаковыми машинами, то ведь и отставать/спешить эти машины будут одинаково.  Поэтому я вижу мало смысла в такой пиринговой синхронизации для получения точного времени.  Хотя всё зависит от задачи -- если главное чтобы на всех машинах было одинаковое время, а какое -- да пусть хоть 90-й год, тогда да, вы мыслите в правильном направлении.

>Какой адрес имеет Ваша система?

В смысле? Это мой домашний компьютер-десктоп.  Полноценная система, но как видите -- NTP-клиент весит мало.

>Мне при этом полагаю потребуется также NTP-Сервер
>для ноутбука программить или скопировать где-то,- так как выхода в интернет
>из локальной сетки не предусмотрено?

NTP-сервер уже написан под opensource лицензией.  Можно синхронизироваться и с сервером в интернете, потому что NTP учитывает задержки на передачу пакетов, но для вашей задачи ИМХО, будет проблематично зависеть от сервера в интернете и самого соединения с интернетом.  Поэтому NTP-сервер без проблем можно поставить на ноутбук, всё равно на ноутбуке будет стоять какая-то прога, отдающая время клиентам.


"Синхронизация времени"
Отправлено Gor , 27-Июл-07 23:48 
>Если вы синхронизируете время между одинаковыми машинами, то ведь и отставать/спешить эти
>машины будут одинаково.  Поэтому я вижу мало смысла в такой
>пиринговой синхронизации для получения точного времени.  Хотя всё зависит от
>задачи -- если главное чтобы на всех машинах было одинаковое время,
>а какое -- да пусть хоть 90-й год, тогда да, вы
>мыслите в правильном направлении.

Именно такая задача и стоит сейчас,- точность соответствия времени нынешнему для меня не решаюшая.

>В смысле? Это мой домашний компьютер-десктоп.  Полноценная система, но как видите
>-- NTP-клиент весит мало.

Я Вас неправильно понял поначалу,- сори. Сейчас почитал доку по НТП и понимаю больше, спасибо большое за совет!


"Синхронизация времени"
Отправлено vic , 27-Июл-07 17:05 
>[оверквотинг удален]
>Я пытаюсь сейчас синхронизировать время между моим Ноутбуком и машинами с очень
>ограниченным набором "включённых служб" и доступных ресурсов, работающих на 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.


"Синхронизация времени"
Отправлено Gor , 27-Июл-07 23:39 
>ээээ...
>
>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 битовыми процессорами.

Я уже посмотрел НТП,- спасибо большое за совет, надо будет теперь доустановить НТП-клиент на машинах и настроить НТП-сервер на ноуте.


"Синхронизация времени"
Отправлено FarID , 07-Авг-07 11:30 
>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