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

คู่มือเกมแลค › ปัญหาที่เกิดกับบางคนเท่านั้น

พอร์ต UDP แบบตายตัวชนกัน Two clients bound to the same local UDP port

ID สาเหตุ pt-port-collision · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)

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

ถ้าไคลเอนต์ถูกออกแบบให้ใช้พอร์ตภายในเครื่องที่กำหนดตายตัว ไคลเอนต์ตัวที่สองบน PC เดียวกันจะใช้พอร์ตไม่ได้ หรือต้องแบ่งรับแพ็กเก็ตกับตัวแรก

ทำไม สองไคลเอนต์พยายามเปิดพอร์ต UDP ภายในเครื่องพอร์ตเดียวกัน (ฝืนใช้ร่วมกันด้วยออปชัน reuse) → ผลคือ OS ส่งแพ็กเก็ตขาเข้าให้ซ็อกเก็ตฝั่งเดียว หรือไม่รับประกันว่าฝั่งไหนจะได้รับ เราเตอร์และเซิร์ฟเวอร์ก็มองสองไคลเอนต์เป็นที่อยู่เดียวกัน → บนหน้าจอ ฝั่งหนึ่งไม่ได้รับแพ็กเก็ตของโลกในเกม จึงมองไม่เห็น NPC และผู้เล่นคนอื่น หรือหลุด

อาการ
มองไม่เห็น/ตัวผี, หลุด, เข้าเกมไม่ได้/โหลดไม่จบ
ปัจจัย
แพ็กเก็ตหาย
ใครเจอ
ไคลเอนต์เดียวในเครื่องที่เปิดหลายจอ
เกิดเมื่อไร
หลังล็อกอิน/หลังปิดปรับปรุง, ตลอดเวลา
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
ไคลเอนต์: ให้ OS เลือกพอร์ตภายในเครื่องอัตโนมัติ (bind พอร์ต 0) เซิร์ฟเวอร์: แยกการเชื่อมต่อด้วย session token ที่ออกให้แต่ละการเชื่อมต่อ
บนกราฟ
สูงเฉพาะบางกลุ่ม · จำนวนแพ็กเก็ตที่ได้รับแยกตามไคลเอนต์
จุดที่ต้องดู
บน PC ของผู้เล่น เปิดสองไคลเอนต์ไว้พร้อมกันแล้วใช้ netstat -ano -p udp ใน Command Prompt ดูพอร์ต UDP ภายในเครื่องที่แต่ละโปรเซสเกม (PID) เปิด ฝั่งเซิร์ฟเวอร์ให้ตรวจว่าสองเซสชันเข้ามาด้วย public IP และพอร์ตเดียวกันหรือไม่
สัญญาณว่าใช่
สองโปรเซสเกมผูกอยู่กับพอร์ตภายในเครื่องเดียวกัน หรือบนเซิร์ฟเวอร์เห็นสองเซสชันเป็น IP และพอร์ตเดียวกัน ถ้าเปิดฝั่งเดียวจะปกติ
สัญญาณว่าไม่ใช่
สองไคลเอนต์ใช้พอร์ตภายในเครื่องต่างกันแต่ฝั่งหนึ่งยังผิดปกติ: น่าจะเป็น “บั๊กแยกเซสชันด้วย IP/ID เครื่อง” หรือ “การจำกัดการเปิดหลายไคลเอนต์”
วิธีตรวจ
ตรวจที่สภาพแวดล้อมฝั่งผู้เล่น

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

  1. Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE Microsoft
    ถ้า bind พอร์ตเดียวกันเป็นตัวที่สองด้วย SO_REUSEADDR จะแย่งพอร์ตไป และไม่รู้ว่าซ็อกเก็ตไหนจะได้รับแพ็กเก็ต
  2. bind function (winsock.h) Microsoft
    ถ้า bind พอร์ต 0 จะได้พอร์ตที่ไม่ซ้ำจากช่วง dynamic port (49152–65535)
  3. netstat Microsoft
    -a แสดงพอร์ต TCP/UDP, -n แสดงที่อยู่เป็นตัวเลข, -o แสดง process ID (PID), -p udp แสดงเฉพาะ UDP

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

ชั้นเดียวกัน: ปัญหาที่เกิดกับบางคนเท่านั้น

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (มองไม่เห็น/ตัวผี)

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