한국어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 เพื่อไม่ให้รับข้อความแจ้งนี้, ถ้าเกิดข้อผิดพลาดตอนรับให้บันทึก log ไว้แล้วรับต่อไป
บนกราฟ
การเชื่อมต่อหลุดพร้อมกัน · จำนวนการเชื่อมต่อ, log ข้อผิดพลาดตอนรับ
จุดที่ต้องดู
รหัสข้อผิดพลาดตอนรับ UDP (WSAECONNRESET, 10054) และบันทึกว่าลูปรับหยุดหรือซ็อกเก็ตถูกปิดใน log ของเซิร์ฟเวอร์เกม และดูใน packet capture ฝั่งเซิร์ฟเวอร์ว่ามี ICMP Port Unreachable มาถึงก่อนหน้านั้นหรือไม่
สัญญาณว่าใช่
มีบันทึกข้อผิดพลาดตอนรับ WSAECONNRESET ก่อนการเชื่อมต่อหลุดพร้อมกัน และก่อนหน้านั้นมี ICMP Port Unreachable มาจากที่อยู่ของไคลเอนต์ที่เพิ่งออกไป
สัญญาณว่าไม่ใช่
เซิร์ฟเวอร์ Linux หรือโค้ดที่ปิด SIO_UDP_CONNRESET แล้ว: ไม่เกี่ยว
วิธีตรวจ
ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม

แหล่งอ้างอิง

  1. Winsock IOCTLs Microsoft
    SIO_UDP_CONNRESET ใช้เปิดหรือปิดการรายงานข้อความแจ้ง “ไม่พบพอร์ต” (PORT_UNREACHABLE) ของ UDP
  2. recvfrom function (winsock.h) Microsoft
    WSAECONNRESET บนซ็อกเก็ต UDP หมายความว่าการส่งครั้งก่อนได้รับ ICMP Port Unreachable กลับมา
  3. Windows Sockets Error Codes Microsoft
    หมายเลขข้อผิดพลาดของ WSAECONNRESET คือ 10054

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L8 ซ็อกเก็ตและโปรโตคอล

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (หลุด)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง