Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 11.10.2016
Сообщений: 14

Вычислить delay и dispersion для ntp сервера

11.10.2016, 13:21. Показов 1127. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую создать NTP сервер. Возникает проблема cо значениями delay и dispersion, не могу понять, как их вычислить, хоть тресни.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#include <algorithm>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/uio.h>
#include <time.h>
#include <cstdio>
#include <stdio.h>
#include <arpa/inet.h>
using namespace std;
 
typedef unsigned long long tstamp;  //NTP timestamp format
typedef unsigned int tdist;// NTP short format
typedef unsigned long ipaddr;//IPv4 or IPv6 address
typedef unsigned long digest;// md5 digest
typedef signed char s_char;//precision and poll interval (log2)
 
typedef struct{
    unsigned leap : 2;
    unsigned version : 3;//(Version Number)
    unsigned mode : 3;//
 
    uint8_t stratum;//
    uint8_t poll;//
    uint8_t precision;//
 
    uint32_t delay;//задержка - общее время распространения сигнала в обе стороны
    uint32_t dispersion;//макс. ошибка между локальным временем и сервером
    uint32_t reference_identifier;//
 
    uint32_t reference_timestamp_second;//время последней синхронизации
    uint32_t reference_timestamp_fraction;//наносекунды
    uint32_t origin_timestamp_second;//время клиента на момент его запроса
    uint32_t origin_timestamp_fraction;
    uint32_t receive_timestamp_second;//времяполучения запроса от клиента
    uint32_t receive_timestamp_fraction;
    uint32_t transmit_timestamp_second;//время высылки ответа клиенту
    uint32_t transmit_timestamp_fraction;
} ntp_time;
 
    struct addrinfo hints;
    struct sockaddr_in saddr;
    struct hostent *client;
 
char buf[512];
 
int main(int argc, char **argv)
{
    int tmplus = 2208988800;//(70*365 + 17)*86400 = 2208988800
    int skt;//socket
    const char* hostname = "192.168.184.128";
    const char* port = "123";
    memset(&hints, 0, sizeof(hints));
    hints.ai_family=AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_protocol = 0;
    hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
 
    ntp_time in;
    memset(&in,0,sizeof(ntp_time));
    ntp_time out = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    memset(&out,0,sizeof(ntp_time));
    *((char*)&out+0)= 0b00100100;
 
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(port));//
    saddr.sin_addr.s_addr = INADDR_ANY;
 
    skt = socket(AF_INET, SOCK_DGRAM, 0);
    if (skt < 0) {
        printf("socket() error\n");
        return 1;
    }
    
    if (bind(skt,
             (struct sockaddr*) &saddr,
             sizeof(saddr)) < 0) {
        printf("bind() error\n");
        return 1;
    }
 
    struct timespec ts1,ts2,ts3;
    clock_gettime(CLOCK_REALTIME,&ts1);
    printf ("Seconds: %ld\n",ts1.tv_sec);
    printf ("Nanoseconds: %ld\n",ts1.tv_nsec);
    long int timey_sec = ts1.tv_sec;
    printf("Time: %s, nanosec: %ld\n", ctime(&timey_sec), ts1.tv_nsec);
 
 
    while (1) {
        printf("waiting...\n");
    struct sockaddr_in klientaddr;
    socklen_t klientaddr_l = sizeof(klientaddr);
        memset(buf, 0, 512);
        ssize_t r = recvfrom(skt,&in,sizeof(in),0,
                     (struct sockaddr*) &klientaddr,
                     &klientaddr_l);
 
        //rawtime=time(0);
        clock_gettime(CLOCK_REALTIME, &ts2);
        out.reference_timestamp_second=htonl(ts1.tv_sec+tmplus);//последняя синхронизация
        out.reference_timestamp_fraction=ts1.tv_nsec;
 
        out.origin_timestamp_second=in.origin_timestamp_second;//время клиента
        out.origin_timestamp_fraction=in.origin_timestamp_fraction;
 
        out.receive_timestamp_second = htonl(ts2.tv_sec+tmplus);//время получения запроса
        out.receive_timestamp_fraction = ts2.tv_nsec;
 
        out.stratum = max(in.stratum - 1,0);
        out.poll=in.poll;
        out.precision=in.precision;
        out.delay=in.delay;
        out.dispersion=in.dispersion;
        out.reference_identifier=in.reference_identifier;
 
        char clientIP[16];
        //inet_ntop(AF_INET, &klientaddr.sin_addr.s_add , clientIP, sizeof(clientIP));
    inet_ntop(AF_INET, &(klientaddr.sin_addr.s_addr),clientIP, 16);
        printf("From %s\n", clientIP);
 
        clock_gettime(CLOCK_REALTIME, &ts3);
        out.transmit_timestamp_second=htonl(ts3.tv_sec+tmplus);//время ответа клиенту
 
        out.transmit_timestamp_fraction=ts3.tv_nsec;
 
        ssize_t s = sendto(skt, &out, sizeof(out), 0,
                              (struct sockaddr*) &klientaddr,
                              sizeof(klientaddr));
 
        printf("Высылаем время\n");
        if (s==0){
            printf("Пустое сообщение\n");
        }
        else if(s<0)
            printf("высылка не удалась\n");
        else printf("Выслано %s\n", clientIP);
        
        printf("ожидание нового запроса\n");
 
 
    return 0;
}

На данный момент значения delay и dispersion, что в конечном итоге сервер высылает клиенту, равны 1.0000 sec.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2016, 13:21
Ответы с готовыми решениями:

Получить время с NTP сервера
Задача следующая - получить точное время с рабочего (!) надежного (!) ntp сервера. Просто получить. искал на разных форумах, пробовал...

Синхронизация времени с NTP сервера
Подскажите,пожалуйста!Нужно получить время с сервера синхронизации времени ntp.mobatime.ru. Как это сделать?Ни разу такого не делал,поэтому...

Juniper SRX в качестве NTP-сервера
Доброго времени суток. Как настроить Junuper в качестве источника точного времени, чтобы другие машины синхрить?!

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2016, 13:21
Помогаю со студенческими работами здесь

нужен delay для действий в image
если пишу sleep(1000); то image даже не открывается, думал что как то можно с таймером но вообще не представляю как. Буду рад любым дельным...

Разное время задержки Delay для разных заявок
Здравствуйте.Подскажите пожалуйста,как выполнить такое: с одного источника выходят 2 наименования деталей,каждое наименование по 30 шт....

Максимальное значение delay для конструктора класса Timer
t = new Timer(Number.MAX_VALUE, 1); t.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete); В таком случае комплит...

Установка ntp
Помогите пожалуйста настроит ntp на red hat

Cisco NTP
Доброго дня Всем. Появилась проблема с NTP на Cisco 1841. Вот конфиг: ROU-1#sh run | se in ntp ntp access-group peer 2 ntp...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru