Я получил следующий код из сети, чтобы узнать время по Гринвичу с сайта time-a.nist.gov. Этот код работает отлично, но однажды в голубой луне он зависает. Когда я приостанавливаю отладку, зеленая стрелка с сообщением «Это следующий оператор, выполняемый, когда поток возвращается из текущего местоположения», отображается рядом с s.Receive (ntpData);
public static DateTime GetNetworkTime(IPEndPoint ep)
{
Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
s.Connect(ep);
byte[] ntpData = new byte[48]; // RFC 2030
ntpData[0] = 0x1B;
for (int i = 1; i < 48; i++)
ntpData[i] = 0;
s.Send(ntpData);
s.Receive(ntpData);
.
.
}
Итак, я добавил строки
s.SendTimeout = 1000;
s.ReceiveTimeout = 1000;
Теперь он не зависает, но выдает исключение «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время»
StackTrace: в System.Net.Socket.Recieve (буфер Byte [], смещение Int32, Int32, SocketFlags socketFlags)
Является ли это проблемой сайта сервера (time-a.nist.gov) и, следовательно, нет выхода, кроме как вызвать его снова?
Также есть ли способ обработать это исключение и снова вызвать метод GetNetworkTime.
Буду признателен за любую помощь по этой проблеме.
Заранее спасибо