document_cover
แก้ปัญหา Port 3000 ถูกใช้ (In Use) แต่หา Process ไม่เจอ
windowswsl2networkingport
22 ม.ค. 69 , 03:18
รู้จักกับ Windows Excluded Port Range ,, เคยเจอไหม? รัน Server แล้วขึ้น Error "Port 3000 is already in use" ทั้งที่เช็ค netstat หรือ taskkill แล้วไม่เจอใครใช้เลย ปัญหานี้ไม่ได้เกิดจากผีหลอก แต่เป็นเพราะ Windows จอง Port ไว้เองผ่าน Hyper-V หรือ WSL2 บทความนี้จะพาไปดูสาเหตุ วิธีเช็ค และวิธีแก้ปัญหานี้ให้หายขาด

เมื่อรัน 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 ที่จะใช้เองเลยดีกว่า