한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L8 Сокеты и протоколы

Ошибка WSAECONNRESET на UDP-сокете в Windows WSAECONNRESET on a Windows UDP socket

ID причины sk-udp-connreset · Основной ответственный Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Когда сервер на 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
Чем проверить
Нужны логи и метрики игрового сервера или клиента

Источники

  1. Winsock IOCTLs Microsoft
    SIO_UDP_CONNRESET включает и выключает уведомления UDP «порт недоступен» (PORT_UNREACHABLE)
  2. recvfrom function (winsock.h) Microsoft
    WSAECONNRESET на UDP-сокете означает, что на предыдущую отправку пришёл ответ ICMP Port Unreachable
  3. Windows Sockets Error Codes Microsoft
    Код ошибки WSAECONNRESET: 10054

Смотрите также

Тот же слой: L8 Сокеты и протоколы

Причины с тем же симптомом (Дисконнект) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами