Когда сервер на Windows отправляет UDP уже ушедшему клиенту, обратно приходит уведомление «порт недоступен» (ICMP). Из-за него следующий вызов приёма завершается ошибкой, и если код сервера считает её поломкой самого сокета, страдают все, кто работает через этот сокет.
Почему Сервер продолжает слать UDP на адрес только что вышедшего клиента, и обратно приходит «порт недоступен» (ICMP) → Следствие Windows завершает следующий вызов приёма ошибкой WSAECONNRESET (10054), а код сервера прекращает приём или закрывает сокет → На экране У всех, кто работал через этот сокет, разом фриз или дисконнект
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Отключить SIO_UDP_CONNRESET через WSAIoctl, чтобы не получать это уведомление, а при ошибке приёма только писать в лог и продолжать приём.
На графике
Массовый обрыв соединений · число подключений, лог ошибок приёма
Где смотреть
Найти в логах игрового сервера коды ошибок приёма UDP (WSAECONNRESET, 10054) и записи об остановке цикла приёма или закрытии сокета, а по захвату пакетов на стороне сервера проверить, приходил ли перед этим ICMP Port Unreachable
Подтверждает
Прямо перед массовым обрывом подключений записана ошибка приёма WSAECONNRESET, а перед ней с адреса только что вышедшего клиента пришёл ICMP Port Unreachable
Опровергает
Неприменимо, если сервер на Linux или код уже отключил SIO_UDP_CONNRESET
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Источники
Winsock IOCTLsMicrosoft SIO_UDP_CONNRESET включает и выключает уведомления UDP «порт недоступен» (PORT_UNREACHABLE)
recvfrom function (winsock.h)Microsoft WSAECONNRESET на UDP-сокете означает, что на предыдущую отправку пришёл ответ ICMP Port Unreachable