哪個程式正在使用這個連接埠?
伺服器無法在 8080 連接埠啟動,或測試以 "address already in use" 錯誤結束。不是已有程式佔用了該連接埠,就是 Windows 把它保留了,而這兩種錯誤看起來很像。以下說明如何分辨。
連接埠打不開的兩個原因
| 發生了什麼 | 表現 | 怎麼辦 |
|---|---|---|
| 有程式佔用連接埠 | 錯誤訊息指出位址已被使用(EADDRINUSE,或 Windows 錯誤 10048)。該程式會出現在通訊端清單中。 | 關閉該程式,或換一個連接埠。 |
| Windows 保留了連接埠 | 錯誤訊息指出存取被禁止(Windows 錯誤 10013),但並沒有程式在監聽。清單中沒有任何程式。 | 換一個保留範圍之外的連接埠,或釋放該範圍。重新啟動 WinNAT 服務通常有效。 |
用 Windows 內建的工具
通訊端清單以處理程序 ID 表示擁有者。先找到連接埠,再查這個 ID:
netstat -ano | findstr :8080
tasklist /fi "PID eq 4321"
在 PowerShell 中同樣可以查,TCP 與 UDP 都行:
Get-NetTCPConnection -LocalPort 8080 | Select-Object LocalAddress, State, OwningProcess
Get-NetUDPEndpoint -LocalPort 5353 | Select-Object LocalAddress, OwningProcess
Get-Process -Id 4321
如果沒有程式佔用連接埠,就查看 Windows 保留了哪些範圍:
netsh int ipv4 show excludedportrange protocol=tcp
再用 protocol=udp 執行一次。保留範圍依通訊協定分別記錄,所以同一個連接埠可能對 UDP 是空閒的,對 TCP 卻被保留。
用 Tools 索引標籤
Tools 索引標籤不需要主控台就能回答同樣的問題:
- Sockets會列出這台電腦上每個 TCP 與 UDP 通訊端,類似
netstat -ano:誰在監聽、誰已連線、狀態如何、屬於哪個程式。它不需要工作階段。可以用lport:8080或state:listen搜尋。 - Port check問的正是你的伺服器問過的問題:程式能不能使用這個連接埠?輸入 8080、一個清單(如
80, 443)或一個範圍(如9000-9100,最多 1000 個連接埠),然後按下 Check。每個連接埠都會針對 TCP 與 UDP、IPv4 與 IPv6 逐一嘗試,並標示為 Free、In use(附上程式及其 PID)或 Reserved by Windows。
所以結果是一張表,而不是簡單的「是」或「否」:Windows 依通訊協定分別保留範圍,監聽 IPv6 的程式可以佔著一個在 IPv4 上空閒的連接埠。
不會透過網路傳送任何內容。對每個連接埠,工具都在本機的迴路位址上向 Windows 申請它,然後立刻歸還。
知道是誰佔用之後
在任一表格中按右鍵點選某一列,即可把佔用該連接埠的程式設為目標。這只會填寫目標欄位,在你按下 START 之前不會有任何改變。接下來怎麼做,見只針對一個應用程式。
它不做什麼
它只讀取,不修復:從不關閉程式,也從不釋放保留範圍。屬於其他帳戶的通訊端不會顯示程式,除非該工具以系統管理員身分執行。