Определите, было ли SocketException из UdpClient.Receive вызвано тайм-аутом - PullRequest
1 голос
/ 17 января 2020

У меня есть UdpClient получение данных с установленным тайм-аутом, например:

UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 12345));
client.Client.ReceiveTimeout = 5000;     // 5 second timeout

while (!shutdown) {
    IPEndPoint source = null;
    byte[] data = client.Receive(ref source);  
}

Receive - задокументировано как выдача SocketException если "произошла ошибка, когда доступ к сокету ". Поведение настройки ReceiveTimeout также задокументировано как выбрасывание SocketException, если время синхронной операции истекло.

Если я получаю SocketException из Receive, когда тайм-аут установить, как я могу определить, было ли исключение вызвано тайм-аутом, а не более серьезной ошибкой?

Я подтвердил, что исключение, вызванное тайм-аутом, является действительным SocketException, а не каким-то конкретным c подклассом этого Единственное, о чем я могу подумать, это проверить сообщение об исключении, которое мне не особо нравится.

1 Ответ

1 голос
/ 17 января 2020

Вам необходимо проверить SocketException.ErrorCode свойство на значение 10060 (WSATIMEDOUT).

Полный список ErrorCode значений вы можете найти здесь: https://docs.microsoft.com/windows/win32/winsock/windows-sockets-error-codes-2

...