Тайм-аут в Socket.Recieve - PullRequest
       2

Тайм-аут в Socket.Recieve

0 голосов
/ 20 июля 2011

Я получил следующий код из сети, чтобы узнать время по Гринвичу с сайта 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.

Буду признателен за любую помощь по этой проблеме. Заранее спасибо

1 Ответ

0 голосов
/ 20 июля 2011

Тайм-ауты сокетов работают только при использовании асинхронных версий методов чтения и записи: BeginRead и BeginWrite Синхронные версии будут зависать бесконечно или до тех пор, пока соединение не будет разорвано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...