Ошибка сокета 10052 на сокете UDP
У нас есть настольное приложение .NET 2.0, которое отправляет и получает сеть
пакетов через UDP.
Несколько пользователей сообщили о случайной ошибке сокета 10052, которая происходит
когда код вызывает socket.BeginReceiveFrom на UDP-сокете.
Что это значит?
Официальная документация MS для сокета об ошибке 10052 говорит - quote:
"WSAENETRESET (10052) Сетевое соединение отключено на reset.
был нарушен из-за активности активности, обнаруживающей отказ, в то время как
продолжалась операция. Он также может быть возвращен setsockopt, если
делается попытка установить SO_KEEPALIVE на соединение, которое уже
не удалось ".
Это просто не имеет смысла для UDP-сокета, поскольку UDP является
протокол без установления соединения.
Я знаю, что еще один код ошибки 10054 в связи с сокетами UDP
означает, что получено сообщение ICMP "Port Unreachable", и я
интересно, может ли 10052 сопоставить другое сообщение ICMP?
Я искал это в течение нескольких месяцев, читал сетевые книги и т.д., но не могу найти
что-нибудь.
Пожалуйста, помогите - что означает ошибка сокета 10052 на гнезде UDP?
Заранее спасибо
Ответы
Ответ 1
См. http://msdn.microsoft.com/en-us/library/ms740120%28v=vs.85%29.aspx, в котором описывается функция recvfrom. В нем говорится о WSAENETRESET (который является ошибкой winsock 10052):
Для сокета датаграммы эта ошибка указывает на то, что время жизни истекло.
Ответ 2
Убедитесь, что значение TTL достаточно велико при отправке дейтаграмм UDP.
Если вы используете класс UdpClient.
Затем перед отправкой дейтаграммы используйте следующее:
myUdpClient.Ttl = 255;
Примечание: 255 - максимальное значение для TTL.
Существует проблема с сетью, если этого значения недостаточно.
Ответ 3
WSAE NET RESET предполагает, что это происходит из-за RESET самого сетевого интерфейса. Ваша программа сидит там, привязанная к UDP-порту, поэтому в некотором смысле она подключена, но к сетевому интерфейсу, а не к удаленному узлу.
Попробуйте запустить свою программу, доведя ее до того момента, когда будет запущен этот вызов BeginReceiveFrom, затем отключите ваш сетевой адаптер в диспетчере устройств и снова включите его. Или, используя Wi-Fi, снимите и восстановите соединение с WAP. Это может произойти, просто отсоединив кабель Ethernet к вашему компьютеру, так как последние версии Windows по умолчанию убивают все сокеты, подключенные через этот сетевой адаптер, когда это происходит.
Это объясняет редкие сообщения о проблемах с поля. Вероятно, это происходит только тогда, когда на аппаратном уровне возникает локальная сетевая ошибка.