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

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

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

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

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

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

Ограничения / Дороги

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

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

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

1 ответ

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

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

  • Иметь общий сервер времени, доступный A и 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 достаточно точными для вас.

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

Другие вопросы по тегам