เมื่อรัน Server แล้วพบ Error EADDRINUSE: address already in use :::3000

แต่เมื่อตรวจสอบด้วยคำสั่ง netstat หรือ taskkill กลับไม่พบ Process ใดๆ ทำงานอยู่ ปัญหานี้เกิดจากฟีเจอร์ Excluded Port Range ของ Windows
สาเหตุของปัญหา
ในเครื่องที่มีการใช้งาน Docker Desktop, WSL2 หรือ Hyper-V ระบบ Windows จะทำการจองช่วง Port (Reserved Ports) ไว้สำหรับ NAT (Network Address Translation) ภายใน หาก Port ที่ต้องการใช้งาน (เช่น 3000) ตกอยู่ในช่วงที่ Windows สุ่มจองไว้ จะทำให้ไม่สามารถใช้งาน Port นั้นได้ แม้จะไม่มีโปรแกรมใดรันอยู่ก็ตาม
วิธีตรวจสอบ
เปิด Command Prompt (CMD) หรือ PowerShell ในสิทธิ์ Administrator และพิมพ์คำสั่ง
netsh interface ipv4 show excludedportrange protocol=tcpจะได้ผลแบบนี้
> netsh interface ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
2546 2645
2846 2945
2972 3071
3813 3912
12153 12252
50000 50059 *
* - Administered port exclusions.ตรวจสอบตารางผลลัพธ์ว่า Port ที่ต้องการใช้ อยู่ในระหว่างช่วง Start Port และ End Port หรือไม่ หากอยู่ในช่วงดังกล่าว แสดงว่าถูก Windows จองไว้
เช่นในตัวอย่างผมโดน 2972 - 3071 ซึ่ง มี 3000 ที่จะใช้ในนั้น
วิธีแก้ไข
รีสตาร์ท Network Service ด้วย CMD (Administrator
net stop winnat
net start winnatแล้วลอง check อีกที จะพบว่า มันสุ่ม port ใหม่ , ซึ่งถ้ายังโดนอีก ก็ลางไม่ดีแล้ว
เปลี่ยน Port ที่จะใช้เองเลยดีกว่า
