遊戲 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 與指標
出處
- Winsock IOCTLs Microsoft
以 SIO_UDP_CONNRESET 開啟或關閉 UDP「port 無法到達」(PORT_UNREACHABLE)通知的回報 - recvfrom function (winsock.h) Microsoft
UDP socket 上的 WSAECONNRESET 表示先前的傳送收到了 ICMP Port Unreachable - Windows Sockets Error Codes Microsoft
WSAECONNRESET 錯誤代碼 10054
相關原因
同一層:L8 Socket 與協定
同一症狀(斷線)在其他層的原因
查看含圖解與實驗的完整版卡片