我们正准备推出其中一款新产品的测试版,由于我们尚未投入许可组件,我们决定只投入定时炸弹,因此测试版无效在某个约会之后。显然,我们不想只信任系统时间,因为这很容易回滚。
我们已经对互联网上的几个不同的NTP服务器进行了检查,并对一些主要网站的HTTP响应标题中的时间进行了一些检查,但我们的软件旨在用于一个并非闻所未闻的行业。拥有一个无法访问Internet的安全本地网络。因此,我们认为通过SNTP(或NTP,如果这更容易)从本地网络的时间服务器(如果有的话)获取日期会很好。
我们只需要一个简单的查询,我在网上看到的所有C#SNTP示例都是功能齐全的客户端,能够使计算机的系统时间保持同步,并在您要配置的任何层中充当本地NTP服务器他们为我们的需要完全矫枉过正。
任何人都可以解释如何进行这样的广播查询吗?我们的NTP查询代码需要一个特定的地址才能连接,显然我们不会知道客户的本地网络。
答案 0 :(得分:0)
记得这个问题,我想发布了我发现的解决方案:
var cmd = new System.Diagnostics.Process
{
StartInfo =
{
FileName = "cmd.exe",
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
RedirectStandardOutput = true,
Arguments = "/C net time /DOMAIN:" + Environment.UserDomainName,
UseShellExecute = false
}
};
cmd.Start();
string output = cmd.StandardOutput.ReadToEnd();
if (output.EndsWith("The command completed successfully.\r\n\r\n"))
{
int is_index = output.IndexOf("is ");
int serv_start = output.IndexOf(@"\\") + 2;
int serv_end = is_index - 1;
string time_server = output.Substring(serv_start, serv_end - serv_start).Split(new char[] { '.' })[0];
if (time_server == Environment.MachineName)
return DateTime.MaxValue; // local machine is acting as time server
int time_start = is_index + 3;
int time_end = output.IndexOf("\r");
string local = output.Substring(time_start, time_end - time_start);
return DateTime.ParseExact(local, "M/d/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
}
return DateTime.MaxValue;
这从域的时间服务器获取当前时间;如果命令失败或本地计算机是时间服务器,它将返回DateTime.MaxValue(如果您信任系统时间,为什么要检查本地网络?)。为简洁起见,省略了异常处理。
我不调查了net time
用于格式化其输出的文化,因此可能需要使用InvariantCulture之外的其他内容。