Просто, потому что никто еще еще не сказал волшебные слова: это пустой оператор объединения. Это определяется в разделе 7.12 из спецификация языка .
C# 3.0, Это очень удобно, особенно из-за способа, которым это работает, когда это используется многократно в выражении. Выражение формы:
a ?? b ?? c ?? d
даст результат выражения a
, если это будет непустым, иначе попробуйте b
, иначе попробуйте c
, иначе попробуйте d
. Это закорачивает в каждой точке.
кроме того, если тип d
является не допускающим NULL-значения, тип целого выражения является не допускающим NULL-значения также.
(Это не алгоритм Марзулло. Он используется только высокоуровневыми серверами для получения действительно точного времени с использованием нескольких источников. Именно так обычный клиент получает время, используя только один сервер )
Прежде всего, временные метки NTP сохраняются в секундах с 1 января 1900 г. 32 бита для количества секунд и 32 бита для долей секунды.
Синхронизация сложна. Клиент сохраняет метку времени (скажем, A) (все значения указаны в секундах), когда он отправляет запрос. Сервер отправляет ответ, состоящий из «истинного» времени, когда он получил пакет (назовите это X), и «истинного» времени, когда он будет передавать пакет (Y). Клиент получит этот пакет и зарегистрирует время его получения (B).
NTP предполагает, что время, проведенное в сети, одинаково для отправки и получения. При достаточном количестве интервалов в нормальных сетях это должно быть так. Мы знаем, что общее время прохождения от отправки запроса до получения ответа составило BA секунд. Мы хотим удалить время, которое сервер потратил на обработку запроса (YX), оставив только время обхода сети, так что это BA- (YX). Поскольку мы предполагаем, что время обхода сети симметрично, время, необходимое для получения ответа от сервера клиенту, составляет [BA- (YX)] / 2. Итак, мы знаем, что сервер отправил свой ответ в момент Y, и нам потребовалось [BA- (YX)] / 2 секунды, чтобы этот ответ дошел до нас.
Таким образом, истинное время, когда мы получили ответ, - Y + [ BA- (YX)] / 2 секунды. Вот как работает NTP.
Пример (в целых секундах, чтобы упростить вычисления):
В правильной реализации клиент все время работает как демон. В течение длительного периода времени с множеством выборок NTP может фактически определить, являются ли часы компьютера медленными или быстрыми, и автоматически настроить их соответствующим образом, позволяя ему поддерживать достаточно хорошее время, даже если он позже будет отключен от сети. Вместе с усреднением ответов от сервера и применением более сложного мышления вы можете получить невероятно точное время.
Конечно, для правильной реализации есть нечто большее, но в этом суть.
позволяя ему сохранять достаточно хорошее время, даже если позже он будет отключен от сети. Вместе с усреднением ответов от сервера и применением более сложного мышления вы можете получить невероятно точное время.Конечно, для правильной реализации есть еще кое-что, но это суть.
позволяя ему сохранять достаточно хорошее время, даже если позже он будет отключен от сети. Вместе с усреднением ответов от сервера и применением более сложного мышления вы можете получить невероятно точное время.Конечно, для правильной реализации есть еще кое-что, но это суть.
ЕСЛИ вы используете временные метки для определения порядка, в частности времена могут не быть необходимыми. Вместо этого вы можете использовать часы lamport , которые менее проблемны, чем сетевая синхронизация. Он может сказать вам, что было «первым», но не точную разницу во времени. Его не волнует, что на самом деле говорят часы компьютера.
Уловка в том, что некоторые пакеты бывают быстрыми, а быстрые пакеты дают вам жесткие ограничения по времени.