Назад | Перейти на главную страницу

запрос данных из NTP в ubuntu с использованием сокета

Я настроил ntp для использования gpsd в качестве эталонного сервера на моей машине. Я запрашиваю данные напрямую из ntp, используя сокет udp. Для ip-адреса я использую localhost и port_number = 123. Я использую следующую структуру пакета:

typedef struct {
  uint8_t li_vn_mode;  // Eight bits. li, vn, and mode.
                       // li.   Two bits.   Leap indicator.
                       // vn.   Three bits. Version number of the protocol.
                       // mode. Three bits. Client will pick mode 3 for client.

  uint8_t stratum;  // Eight bits. Stratum level of the local clock.
  uint8_t poll;     // Eight bits. Maximum interval between successive messages.
  uint8_t precision;  // Eight bits. Precision of the local clock.

  uint32_t rootDelay;  // 32 bits. Total round trip delay time.
  uint32_t
      rootDispersion;  // 32 bits. Max error aloud from primary clock source.
  uint32_t refId;      // 32 bits. Reference clock identifier.

  uint32_t refTm_s;  // 32 bits. Reference time-stamp seconds.
  uint32_t refTm_f;  // 32 bits. Reference time-stamp fraction of a second.

  uint32_t origTm_s;  // 32 bits. Originate time-stamp seconds.
  uint32_t origTm_f;  // 32 bits. Originate time-stamp fraction of a second.

  uint32_t rxTm_s;  // 32 bits. Received time-stamp seconds.
  uint32_t rxTm_f;  // 32 bits. Received time-stamp fraction of a second.

  uint32_t txTm_s;  // 32 bits and the most important field the client cares
                    // about. Transmit time-stamp seconds.
  uint32_t txTm_f;  // 32 bits. Transmit time-stamp fraction of a second.

} ntp_packet;  // Total: 384 bits or 48 bytes.

При этом я рассчитываю смещение по формуле

0.5 * ((server_receivetime - client_sendtime) + (server_sendtime - client_receivetime));

Теперь я вручную останавливаю службу gpsd и запускаю эту программу вместе с ntpq -p . ntpq команда показывает мне смещение более 10 секунд, тогда как моя программа всегда будет давать смещение как 0,008 миллисекунды. Кажется, что моя программа использует одни и те же часы для клиента и сервера. тогда как ntpq запрашивает откуда-то еще. Как я могу получить такое же смещение, как ntpq команда?

Если я использую ip_address для server = "us.pool.ntp.org" Я получаю смещение около 12 миллисекунд.