2016-03-02 79 views
0

我有以下代码从time.nist.gov读取时间:C#StreamReader的ReadToEnd的冻结

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的获得无限期冷冻,我想是因为它没有达到和结束。

是否可以设置此操作的超时时间?

或者更好的选择来读取服务器响应?

谢谢。

+1

使用端口13(白天协议)是一个坏主意。它没有确定回应的格式,所以你不知道什么时候得到完整回复。当服务器没有断开连接时没有结束。该协议仅适用于终端,人力等待。至少使用NTP,也许你不应该自己写。已完成。 –

+0

港口13闹鬼。 – usr

回答

2

根据MSDN

ReadToEnd的假设,当它已经到头流知道。对于服务器只在需要时才发送数据并且不关闭连接的交互式协议,ReadToEnd可能会无限期地阻塞,因为它没有达到结束,应该避免。

你知道你有多读吗?如果是这样,你可以使用Read()

编辑:

我测试此代码(很好,非常类似的东西),发现ReadToEnd工作正常,除非端口13被阻止,在这种情况下,它也运行,而无需返回,我也是如此。所以,在做这件事之前检查你的防火墙。

汉斯的建议是使用现有的经过良好测试的NTP库。