C#streamreader读到最后冻结

C#streamreader读到最后冻结,c#,.net,C#,.net,我有以下代码从time.nist.gov读取时间: TcpClient client = new TcpClient(); var result = client.BeginConnect("129.6.15.28", 13, null, null); var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); if (!success || !client.Connected) // Tim

我有以下代码从time.nist.gov读取时间:

TcpClient client = new TcpClient();
var result = client.BeginConnect("129.6.15.28", 13, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); 
if (!success || !client.Connected)
          // Timeout
else{
      streamReader = new StreamReader(client.GetStream());
      var response = streamReader.ReadToEnd();
      //code   
}
问题是,有时ReadToEnd会被无限期冻结,我想是因为它没有到达和结束

是否可以为此操作设置超时

或者是读取服务器响应的更好选项

谢谢

根据:

ReadToEnd假设流知道何时到达终点。对于交互式协议,在这种协议中,服务器仅在您请求数据时才发送数据,并且不关闭连接,ReadToEnd可能会无限期阻塞,因为它没有到达终点,因此应该避免

你知道你读了多少吗?如果是这样,你可以使用

编辑:

我测试了这段代码(非常类似),发现
ReadToEnd
工作正常,除非端口13被阻塞,在这种情况下,它也会运行而不返回给我。因此,在执行此操作之前,请检查防火墙

更好的是Hans建议使用现有的、经过良好测试的NTP库

使用端口13(日间协议)是一个相当糟糕的主意。它没有确定响应的格式,因此您不知道何时得到完整的响应。当服务器没有断开连接时,就没有结束。协议只适用于终端,人类等待。至少使用NTP,也许你不应该自己写。已经完成了。