C # / Теоретический - Как я могу выяснить, сколько времени занимает событие * между двумя компьютерами * - PullRequest
0 голосов
/ 19 сентября 2018

Я приложу все усилия, чтобы объяснить ситуацию, но, пожалуйста, задавайте любые вопросы, если мне не ясно об этом.

Моя ситуация: у меня есть два компьютера, A и B. На компьютере A у меня есть программа, которая просматривает базу данных и отображает ее для пользователя.На компьютере B у меня есть программа, в которой различные действия пользователя приводят к тому, что данные в конечном итоге попадают в указанную базу данных (очень непрямой процесс во многих сторонних приложениях).

Моя «цель»: мне нужно со времени, когда я выполняю действие над B, выяснить, сколько времени потребуется мне, чтобы получить доступ к этим данным из программы на A. В идеале мне нужночтобы уменьшить погрешность до 50 мс.

Инструменты:

  • Компьютеры A и B совместно используют локальное соединение
  • Они могут связываться через TCP-и IЯ использовал C # для этого общения раньше.Я знаю, что это не совсем точно, но мы можем эффективно рассматривать времена связи B-> A и A-> B как постоянные (но каждое направление является их собственной константой)
  • Они имеют доступ к общемуСетевой диск, отформатированный в NTFS.
  • Я могу сказать, в незначительной степени (для этой цели O (n) фактически равно нулю), на B, когда действие выполнено
  • Я могу сказатьв незначительной степени (обрабатывайте O (n) как ноль), когда значение доступно из программы / базы данных в A.

Ограничения / блокпосты

  • Компьютер Bне имеет доступа в Интернет
  • Нельзя доверять часам, чтобы они были синхронизированы, даже если время в данный момент выглядит синхронизированным.Я видел, как часы на обоих компьютерах отстали друг от друга на несколько минут.Я не знаю, как определяются временные метки на сетевом диске.
  • В то время как время в TCP-коммуникации эффективно для меня постоянно, я не знаю, что это за константы (A-> B и B-> A) или как их измерять.
  • Действия и поиск выполняются в сторонних программах, база данных является отражением другой базы данных, и я не могу получить доступ к серверу, на котором эти значения включены.
  • (Редактировать / добавить) Компьютер B не знает, когда данные попадают в базу данных, только когда срабатывает действие по их размещению.

Iдумаю, что в конечном итоге это превращается в какую-то математическую задачу, в которой я бы как-то использовал различия в метках времени для сообщений в пределах каждого компьютера вместо сравнения меток времени между компьютерами.Таким образом, нужно больше измерить, сколько времени потребуется для работы TCP-соединения, а не смотреть, сколько времени занимает этот процесс.Если бы у меня было это, я мог бы послать сообщение от B к A, когда происходит событие, и сообщение от A к B, когда данные доступны, и затем вычесть время связи.Если это мой лучший вариант, я не знаю, как бы это настроить, практически или теоретически, поскольку я не могу доверять их собственным временным меткам.

Кроме того, хотя я был бы очень признателен за некоторые ответы / ответы / идеи - честно говоря, это для моей пользы, чтобы четко описать и подумать о проблеме.Кроме того, я не смог найти ответ на эту проблему, так что, надеюсь, он появится, если у кого-то еще возникнет подобная проблема в будущем.

1 Ответ

0 голосов
/ 19 сентября 2018

Я не могу получить вашу реальную среду из того, что вы написали, но:

Основные требования:

  • Иметь общий сервер времени, доступный для A и B.
  • Назначьте время для события / записи, созданной B.
  • Время поиска для события / записи на A.

Если одна из этих не может быть предоставлена, я думаю, что нет никакого способа решить,

Если время на локальных компьютерах не может быть синхронизировано достаточно точно, вам необходимо настроить свой собственный сервер времени.Я бы:

Напишите сервер времени, который работает на B и, например, использует Win32 :: GetTickCount в качестве текущего времени.

Сделать текущее время из B доступным для A через соединение tcp (илиточнее: последовательное соединение).

Сохранение времени в записи / событии, произведенном на B

Когда новая запись / событие обнаруживается на A, получить время из записи и получить текущее время на Bчерез TCP-соединение.

Разное время и получить результат.(В этом нет большой математики)

Вы также можете использовать сетевой диск в качестве канала для передачи текущего времени, но я думаю, что синхронизировать доступ к файлам довольно сложно.Я полагаю, что установить TCP-соединение проще.

Может быть, использование LastWriteTime из NAS может быть другим способом получения общего времени.Если все работает так, как я предполагаю, вы можете просто непрерывно записать файл на B и получить LAstWriteTimeSTamp файла на A. Это может быть ваш сервер времени.

Возможно, вы захотите прочитать об установке TCP-соединениямежду двумя компьютерами или выясните, как назначается / запрашивается LAstWriteTimestamp файла в NAS.

Что-то вроде: On B: File.WriteAllText ("\ nas \ timestamp.txt", Guid.NewGuid ());A: aTimeStamp = new FileInfo ("\ nas \ timestamp.txt"). LastWriteTime Возможно LAstWriteTimeUTC.

Вам необходимо проверить, достаточно ли точны для вас LastWriteTime и задержка через nas.

Надеюсь, это немного поможет.

...