Обработка Socket.ReceiveFrom с таймаутом без спам-консоли - PullRequest
3 голосов
/ 01 февраля 2011

Я пишу ServerLocator, который в основном транслирует порт, чтобы найти сервер, который ответит IPEndPoint, и мне нужен поиск, чтобы иметь возможность тайм-аута, если ничего не найдено на текущем IPHost, а затем перейти к следующему.

Сейчас я делаю что-то вроде этого (я удалил некоторые части этого кода, поэтому он содержит только то, что необходимо для отображения моей проблемы. Здесь также происходят некоторые привязки клиентов)

string serverIp = string.Empty;
while(string.isNullOrEmpty(serverIp))
{   
    foreach (IPAddress adress in ipHosts.AddressList)
    {
        using(Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        {
            try
            {
                client.ReceiveFrom(buffer, ref tempRemoteEP);

                //Get server IP
                serverIp = tempRemoteEP.ToString().Split(":".ToCharArray(), 2)[0];
                break;
            }
            catch(SocketException e)
            {
                // We expect connection attempt to time out if we cant find any server on this port and nic. Just continue with the next
                if (e.SocketErrorCode == SocketError.TimedOut)
                {
                    continue;
                }
            }
        }
    }
}

Это работает, как и ожидалось, за исключением того, что консоль получает спам:

Первое исключение типа «System.Net.Sockets.SocketException» произошло в System.dll

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

Спасибо.

1 Ответ

1 голос
/ 01 февраля 2011

На самом деле не нужно беспокоиться об этом, если программа продолжает работать, в программе отправляется множество таких исключений.См. эту статью для получения дополнительной информации о «Исключениях в первый раз».

Также проверьте эту ссылку , чтобы увидеть, как можно настроить Visual Studio для обработки исключений.Если вы настроите их, вы можете прервать (вместо продолжения) исключения и посмотреть, что на самом деле происходит.Тем не менее, обратите внимание, что скрытие исключений, похоже, не работает в режиме отладки, см. здесь или здесь Но, как указал @Cipi, его не должно быть видно в Release.

...