2009-12-16 4 views
1

Я хотел бы знать, был ли способ узнать время, прошедшее во время перемещения данных в сети.C# Socket, время, прошедшее во время отправки

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

Кроме того, важно знать, что мой клиент ДОЛЖЕН работать в асинхронном режиме (это не проблема).

Кто-нибудь знает, как это сделать?

KiTe.

ответ

0

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

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

Что вы можете сделать, если хотите просто проверить и получить представление о среднем времени, чтобы вернуть пакет обратно. В принципе, скажите C, чтобы отправить тот же пакет обратно в B, а затем в A и в A вы сравниваете исходную временную метку с текущим временем (которое будет использовать одни и те же часы). Это даст вам латентность в оба конца, которую вы можете разделить на две, чтобы получить одностороннее время ожидания.

Если вы беспокоитесь о накладных добавили, посылая сообщения тогда вы могли бы сделать одно (или оба) следующий

  1. Отправить гораздо меньший пакет обратно. В основном целое число, соответствующее порядковому номеру принятого сообщения
  2. Только отправьте ACK каждое N-ое сообщение. Должен предоставить достаточное количество данных, чтобы знать «типичное» время ожидания
+0

проблема в том, что мне нужна довольно высокая скорость отправки/получения, поэтому отправка данных, безусловно, замедлит глобальное приложение. Интересно, как они работают в таких играх, как fps или rts: даже там есть центральный сервер, который действует как коммутатор между хостами, есть еще задержка (которая может идти до сотен мс) – Kite

+0

, но в основном, когда я отправляю пакет с моим сокетом, не должен ли я получать ACK? (так как я использую сокеты tcp) И тогда я могу сравнить время, когда я получил ACK со временем отправки данных? , но с .NET-сокетами нет возможности сделать это, поскольку «отправка посылки» или «отправка» не означает, что данные были фактически получены одноранговым узлом ... – Kite

+0

ACK Я предполагаю, что вы говорите опускается вниз на транспортном уровне и не обязательно соответствует ACK, который вы хотите. Пакет можно разделить на несколько пакетов нижнего уровня, каждый с разными ACK. Единственный способ сделать это - реализовать логику ACK самостоятельно, используя механизм, подобный тому, что я описываю в своем ответе.Если вы беспокоитесь о замедлении приложения, тогда вы можете его спроектировать, чтобы он только ACK подавал каждое 10-е сообщение или около того. –

2

Corvil - это хорошо известное программное обеспечение, специально предназначенное для анализа латентности.
Для вашего анализа есть несколько различных слоев программного обеспечения и аппаратных средств, и поэтому его очень сложно реализовать.
Когда дело доходит до синхронизации, более важно иметь надежный ключ, такой как порядковый номер, - поскольку вы используете TCP, у вас есть большая проблема, когда есть проблема с потерей пакета, поскольку это вызывает запрос нескольких пакетов.

+0

Я использую tcp, поэтому не нужно создавать порядковый номер, правильно? но как я только что спросил, возможно ли получить tcp ack с .NET, чтобы убедиться, что сверстник получил данные? Затем нужно сделать проще синхронизацию (мне просто нужно сохранить разницу во времени, с актуализацией при каждом приеме приема/приема и т. Д.) – Kite

+0

Прикладной уровень просто предполагает, что он будет получен, когда отправка будет выполнена , Вы можете угадать время, когда клиент отвечает - но это предположение, которое также будет колебаться в течение дня. – weismat

+0

+1 для порядковых номеров –