2009-12-16 17 views
1

我想知道是否有辦法知道在網絡上傳輸數據的時間。C#套接字,在發送過程中耗用的時間

例如,我從計算機A發送一個數據包到計算機B和C(因此經過的時間可能會因距離不同而各不相同),並且我想知道每個客戶端的發送和接收之間的時間(用於同步精確數據)。

此外,重要的是要知道我的客戶端必須以異步模式工作(這不是問題)。

有人知道該怎麼做嗎?

KiTe。

回答

0

除非你的所有節點都有同步時鐘,否則這幾乎是不可能的。如果你有一個準確的同步機制,並且可以相信時鐘是相同的,那麼當你從A發送一個時間戳到數據包中,然後在C中你將它與當前時間進行比較時,你可以插入一個時間戳。

但是,您需要使用高分辨率時間同步才能使用此方法。

如果您只想進行基準測試並瞭解平均時間,您可以做什麼就是讓數據包反彈回來。基本上,告訴C將相同的數據包發送回B,然後發送給A,並在A中將原始時間戳與當前時間(使用相同的時鐘)進行比較。這會給您一個往返延遲時間,您可以將其分爲兩個以獲得單向延遲時間。

如果你擔心通過發送消息回加那麼你可以做一個開銷(或兩者)以下

  1. 發送一個更小的數據包發送回。基本上是一個對應於接收到的消息的序列號的整數
  2. 只在每第N個消息發送一個ACK。應提供足夠的數據以瞭解「典型」等待時間
+0

問題是我需要相當高的發送/接收速率,所以發回數據肯定會減慢全局appp。 我不知道他們是如何在遊戲中做這樣的fps或rts:即使它有一箇中央服務器作爲主機之間的切換,仍然有一個延遲(可以達到幾百毫秒) – Kite 2009-12-16 09:06:11

+0

但基本上,當我發送一個封包與我的套接字,我不應該收到一個確認? (因爲我使用TCP套接字) 然後我可以比較我收到ACK的時間和發送數據的時間? ,但與.NET套接字不可能這樣做,因爲「結束髮送」或「發送」並不意味着數據實際上已被對方接收... – Kite 2009-12-16 09:09:46

+0

ACK我認爲你在說話大約在傳輸層,並不一定符合你想要的ACK。你的數據包可以被分成多個低級別的數據包,每個數據包都有不同的ACK。做到這一點的唯一方法是使用類似於我在答案中所描述的機制來自己實現ACK邏輯。如果您擔心應用程序放慢速度,那麼您可以設計它,以便每隔10秒左右收到一次。 – 2009-12-16 14:06:41

2

Corvil是專門針對延遲分析的衆所周知的軟件。
爲了您的分析,有幾個不同層次的軟件和硬件方面的參與,因此實施起來非常複雜。
當談到同步時,有一個像序列號這樣的可信密鑰更重要 - 當你使用TCP時,如果在丟失包的過程中遇到問題,因爲這會觸發多個包的請求。

+0

我正在使用tcp,因此創建序列號應該沒有用,對吧? 但正如我剛纔所問,是否有可能得到tcp確認與.NET確保對等接收數據? 那麼它應該是更容易做同步(I只需要存儲的時間的差,在每個發送/ ACK接收被現實化等) – Kite 2009-12-16 09:23:41

+0

應用層只是假設發送完成時,將被接收。您可以猜測客戶是否迴應的時間 - 但這是一種猜測,在白天也會出現波動。 – weismat 2009-12-16 10:40:26

+0

+1表示序號 – 2009-12-16 14:13:42

相關問題