2013-03-01 535 views
3

我試圖讓服務器在外面的時間。如何獲取服務器的時間(包括毫秒或(1/100秒))?

首先,我試過了:

string URL = "http://google.com"; 
System.Net.HttpWebRequest rq2 = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL); 
System.Net.HttpWebResponse res2 = (System.Net.HttpWebResponse)rq2.GetResponse(); 
DateTime xd = rq2.Date; 

但這是緩慢的,並且不包含毫秒。

然後我發現,我實際上可以從目標服務器使用的ntp服務器獲取服務器的時間。

InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("time-b.timefreq.bldrdoc.gov"); 
sntp.Connect(false); // true to update local client clock 
DateTime dt = sntp.DestinationTimestamp.AddMilliseconds(sntp.LocalClockOffset); 
string timeStampNow = dt.ToString("dd/MM/yyyy HH:mm:ss.fff"); 

它工作得很好,不過,我不知道我的目標服務器是否使用NTP服務器,如果是的話,我不知道如何找到它。我花了很多時間研究,所以我決定在這裏問問。

edit2:我沒有任何訪問該服務器(除了訪問它的WWW頁面),我知道,服務器正在使用微軟IIS/7.5網絡服務器

+0

究竟是什麼意思?當你得到它的時候將會(有點)陳舊。 – 2013-03-01 19:17:32

+0

嗯,我可以計算延遲,所以我有時間類似於原始 – Patryk 2013-03-01 19:22:41

+0

不,你不能計算延遲。因爲在請求處理期間您不知道何時檢索到時間值。即使你這樣做了,你也無法可靠地確定服務器的響應需要多長時間。 – 2013-03-01 19:33:32

回答

2

沒有辦法可靠地獲得一個隨機HTTP服務器的時間,分辨率比它在響應頭中返回的時間多。就像你發現的那樣,它只能精確到秒。這不是當前時間,而是服務器填充標題的時間。你不知道請求是在什麼時候發送的,響應被髮送的時間,還是可能是一些隨機的時間,一些愚蠢的程序員塞進標頭只是爲了讓你的生活變得困難。你只能說,「這是服務器報告的時間。」

即使您知道有問題的服務器從中獲得NTP服務器的時間,並假設您可以訪問該服務器,但從中獲取時間並不會爲您提供服務器時間的準確值。服務器定期通過NTP更新他們的時鐘,但這可能是每日,每週,每月或「每當管理員決定」時。 NTP服務器的時間不會準確地反映特定服務器的時間。當然,在一般情況下,不在毫秒範圍內。如果服務器在一段時間內沒有將時鐘與NTP服務器同步,甚至可能在幾分鐘內不會。順便說一下,如果你只是在尋找服務器返回的時間,那麼你應該儘可能地做一個HEAD請求。但是你也必須支持GET請求,因爲許多服務器將響應HEAD請求返回405錯誤。

+0

日期 - \t郵件發送的日期和時間(http://en.wikipedia.org/wiki/List_of_HTTP_header_fields) - 這不是清楚地告訴我,服務器什麼時候返回? – Patryk 2013-03-01 19:39:38

+0

但是「什麼時候發送消息」是什麼意思?字節到達導線的確切時刻?你是否認爲在檢索當前日期和時間的代碼之間可能會有一些(小的,但是可測量的)時間段,並且實際上將字節放在線上? – 2013-03-01 20:18:09