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

遊戲 Lag 白皮書 › L8 Socket 與協定

Windows UDP socket 的 WSAECONNRESET 錯誤 WSAECONNRESET on a Windows UDP socket

原因 ID sk-udp-connreset · 主要負責 遊戲開發團隊(伺服器開發)

在含圖解與實驗的完整版中開啟卡片 →

Windows 伺服器向已經離開的用戶端送出 UDP 時,會收到「port 無法到達」(ICMP)的通知。這個通知會讓下一次接收呼叫以錯誤結束;如果伺服器程式碼把這個錯誤當成 socket 本身故障來處理,所有使用該 socket 的人都會受到影響。

為什麼 持續向剛離開的用戶端位址送出 UDP,收到「port 無法到達」(ICMP)通知 → 於是 Windows 讓下一次接收呼叫以 WSAECONNRESET(10054)錯誤結束,伺服器程式碼因此停止接收或關閉 socket → 畫面上 使用該 socket 的所有人同時定格、斷線

症狀
斷線, 定格
因素
遺失, 停滯
誰會遇到
整個伺服器
何時
偶爾隨機發生, 剛登入/維護剛結束
負責單位
主要負責 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
用 WSAIoctl 關閉 SIO_UDP_CONNRESET,不再接收這個通知;發生接收錯誤時只記 log,繼續接收。
圖表上
連線同時大量中斷 · 連線數、接收錯誤 log
查看位置
在遊戲伺服器 log 中找 UDP 接收錯誤碼(WSAECONNRESET,10054),以及接收迴圈停止或關閉 socket 的紀錄,並用伺服器端的封包擷取看之前是否剛收到 ICMP Port Unreachable
符合的跡象
連線同時大量中斷前剛好記錄到 WSAECONNRESET 接收錯誤,更早之前有 ICMP Port Unreachable 從剛離開的用戶端位址傳來
不符合的跡象
Linux 伺服器,或程式碼已關閉 SIO_UDP_CONNRESET 時不適用
確認方式
需要遊戲伺服器/用戶端的 log 與指標

出處

  1. Winsock IOCTLs Microsoft
    以 SIO_UDP_CONNRESET 開啟或關閉 UDP「port 無法到達」(PORT_UNREACHABLE)通知的回報
  2. recvfrom function (winsock.h) Microsoft
    UDP socket 上的 WSAECONNRESET 表示先前的傳送收到了 ICMP Port Unreachable
  3. Windows Sockets Error Codes Microsoft
    WSAECONNRESET 錯誤代碼 10054

相關原因

同一層:L8 Socket 與協定

同一症狀(斷線)在其他層的原因

查看含圖解與實驗的完整版卡片