哪个程序在使用这个端口?
服务器无法在 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 却被预留。
用 工具 选项卡
工具 选项卡无需控制台就能回答同样的问题:
- 套接字列出这台电脑上的每个 TCP 和 UDP 套接字,类似
netstat -ano:谁在监听、谁已连接、状态如何、归哪个程序所有。它不需要会话。可以用lport:8080或state:listen搜索。 - 端口是否空闲问的正是你的服务器问过的问题:程序能不能使用这个端口?输入 8080、一个列表(如
80, 443)或一个范围(如9000-9100,最多 1000 个端口),然后点击 检查。每个端口都会针对 TCP 和 UDP、IPv4 和 IPv6 逐一尝试,并标记为 空闲、已占用(附带程序及其 PID)或 被 Windows 保留。
所以结果是一张表,而不是简单的“是”或“否”:Windows 按协议分别预留范围,监听 IPv6 的程序可以占着一个在 IPv4 上空闲的端口。
不会通过网络发送任何内容。对每个端口,工具都在本机的环回地址上向 Windows 申请它,然后立刻归还。
知道是谁占用之后
在任一表格中右键点击某一行,即可把占用该端口的程序设为目标。这只会填写目标字段,在你点击 开始 之前不会有任何改变。接下来怎么做,见只针对一个应用。
它不做什么
它只读取,不修复:从不关闭程序,也从不释放预留范围。属于其他账户的套接字不会显示程序,除非该工具以管理员身份运行。