В C#, как я могу запросить удаленный сервер для его текущего времени?Получить точное время для удаленного сервера
схожую функциональность
net time \\servername
но возвращение штамп времени, который включает секунды.
Благодаря
В C#, как я могу запросить удаленный сервер для его текущего времени?Получить точное время для удаленного сервера
схожую функциональность
net time \\servername
но возвращение штамп времени, который включает секунды.
Благодаря
Служба времени Windows реализует NTP. Вот C# implementation of an NTP client. Используемый графический интерфейс Windows можно найти по адресу Simple Network Time Protocol Client. Это Валер Бокан.
Вы можете попытаться получить в дневное время на порт 13:
System.Net.Sockets.TcpClient t = new System.Net.Sockets.TcpClient ("yourmachineHOST", 13);
System.IO.StreamReader rd = new System.IO.StreamReader (t.GetStream());
Console.WriteLine (rd.ReadToEnd());
rd.Close();
t.Close();
Хороший простое решение, если удаленный сервер имеет порт 13 открыт ... Вы можете проверить довольно просто, открыт ли порт, используя телнет yourmachineHOST 13 и увидеть, если вы получите ответ –
Вы можете использовать функцию NetRemoteTOD.
Пример из http://bytes.com/groups/net-c/246234-netremotetod-usage:
// The pointer.
IntPtr pintBuffer = IntPtr.Zero;
// Get the time of day.
int pintError = NetRemoteTOD(@"\\sony_laptop", ref pintBuffer);
// Get the structure.
TIME_OF_DAY_INFO pobjInfo = (TIME_OF_DAY_INFO)
Marshal.PtrToStructure(pintBuffer, typeof(TIME_OF_DAY_INFO));
// Free the buffer.
NetApiBufferFree(pintBuffer);
Простой и рабочий. Благодарю. –
Работаю как шарм. И не нужен удаленный сервер для работы ** Windows Time Service ** (ответ @Reed Copsey) или ** порт 13 open ** (ответ @Zanoni) или ** доступ к файловой системе ** (@bluish answer). Этот подход работает с ** Windows 2000 или выше ** - отлично .. – bairog
Прошу прощения, но этот ответ бесполезен, он указывает на тот же проект, что и ответ [@Reed Copsey] (http://stackoverflow.com/a/1008145/505893). Я вставлю вашу ссылку на этот ответ, и я думаю, что этот ответ должен быть закрыт. Благодаря! – bluish
Использование C# NTP client в Рид Copsey (& Дэвид Лэнг) ответ, вы можете получить время "сейчас" печать (в мс) с/сервера NTP контроллера домена с помощью:
InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("ntp1.ja.net");
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");
Вы можете опубликовать этот код в ответ [@Reed Copsey] (http://stackoverflow.com/a/1008145/505893), поэтому он будет расширен и будет понятен будущим читателям. ;) – bluish
Если у вас есть доступ к файловой системе удаленной системы с UNC-адресом (например, с помощью проводника Windows), вы можете получить удаленное datetime, , даже если это не система Windows, со следующими обходным путем. Создайте фиктивный файл, прочитайте его время записи и выбросьте его. Он также работает для локального хоста.
public DateTime filesystemDateTime(string path)
{
//create temp file
string tempFilePath = Path.Combine(path, "lampo.tmp");
using (File.Create(tempFilePath)) { }
//read creation time and use it as current source filesystem datetime
DateTime dt = new FileInfo(tempFilePath).LastWriteTime;
//delete temp file
File.Delete(tempFilePath);
return dt;
}
class RemoteSystemTime
{
static void Main(string[] args)
{
try
{
string machineName = "vista-pc";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.FileName = "net";
proc.StartInfo.Arguments = @"time \\" + machineName;
proc.Start();
proc.WaitForExit();
List<string> results = new List<string>();
while (!proc.StandardOutput.EndOfStream)
{
string currentline = proc.StandardOutput.ReadLine();
if (!string.IsNullOrEmpty(currentline))
{
results.Add(currentline);
}
}
string currentTime = string.Empty;
if (results.Count > 0 && results[0].ToLower().StartsWith(@"current time at \\" + machineName.ToLower() + " is "))
{
currentTime = results[0].Substring((@"current time at \\" + machineName.ToLower() + " is ").Length);
Console.WriteLine(DateTime.Parse(currentTime));
Console.ReadLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
Обратите внимание, что «текущее время в» неверно, если язык не является английским на вашем локальном компьютере. – bairog
BTW: ** команда NET TIME ** использует ** функцию NetRemoteTOD ** (из ответа @Patrick McDonald): http://blogs.msdn.com/b/w32time/archive/2009/08/07/net-time и-w32time.aspx – bairog
Если вы не можете запросить фактический удаленный сервер для своего времени; вы можете хотя бы запросить тот же контроллер домена/NTP-сервер и получить довольно схожее время. Использование ссылочного клиента NTP так же просто, как var client = new InternetTime.SNTPClient ("pkh-srv-dc03"); client.Connect (false); Console.WriteLine (client.DestinationTimestamp); –