解决 Windows 端口被占用的问题

在启动 Go 服务时,遇到一个报错:

1
2
net.Listen address ":80" failed: listen tcp :80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
1. net.Listen address ":80" failed

一看就是 80 端口被占用了,有可能是 IIS、Apache或你重未听说过的应用,如 SQL Server Reporting Services,那如何找到占用端口的应用呢?

  1. 打开 Windows 命令行工具,CMD、PowerShell 或 PowerShell ISE(我习惯用 ISE,因为它编辑文本一样编辑命令,我 macOS 用的多,Windows 很多快捷键我也不会去记)。

  2. 输入命令 netstat -ano | findstr ":80 PID" 查找端口被占用的 PID。

    1
    2
    3
    4
    5
    6
    7
    PS C:\Users\Administrator> netstat -ano | findstr ":80 PID"
    协议 本地地址 外部地址 状态 PID
    TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
    TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
    TCP 10.46.16.30:62353 120.238.118.141:8081 ESTABLISHED 3380
    TCP [::]:80 [::]:0 LISTENING 4
    TCP [::]:8080 [::]:0 LISTENING 4
  3. 使用 tasklist 命令查找到 PID 为 4 的进程。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    PS C:\Users\Administrator> tasklist /?

    TASKLIST [/S system [/U username [/P [password]]]]
    [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]

    描述:
    该工具显示在本地或远程机器上当前运行的进程列表。

    参数列表:
    ...

    /V 显示详细任务信息。

    /FI filter 显示一系列符合筛选器

    /? Displays this help message.

    筛选器:
    筛选器名称 有效运算符 有效值
    ----------- --------------- --------------------------
    STATUS eq, ne RUNNING | SUSPENDED
    NOT RESPONDING | UNKNOWN
    IMAGENAME eq, ne 映像名称
    PID eq, ne, gt, lt, ge, le PID 值
    SESSION eq, ne, gt, lt, ge, le 会话编号
    SESSIONNAME eq, ne 会话名称
    CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
    hh:mm:ss。
    hh - 小时,
    mm - 分钟,ss - 秒
    MEMUSAGE eq, ne, gt, lt, ge, le 内存使用(以 KB 为单位)
    USERNAME eq, ne 用户名,格式为
    [域\]用户
    SERVICES eq, ne 服务名称
    WINDOWTITLE eq, ne 窗口标题
    MODULES eq, ne DLL name

    注意: 当查询远程计算机时,不支持 "WINDOWTITLE""STATUS"
    筛选器。

    Examples:
    TASKLIST
    ...
    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

    PS C:\Users\Administrator> tasklist /v /fi "pid eq 4"

    映像名称 PID 会话名 会话# 内存使用 状态 用户名 CPU 时间 窗口标题

    ========================= ======== ================ =========== ============ =============== ================================================== ============ ====
    ====================================================================
    System 4 Services 0 312 K Unknown 暂缺 0:52:22 暂缺
  4. 进程名称为 System,那一般就是微软自己的软件产品,可能是这些服务:

    1. SQL Server Reporting Services (MSSQLSERVER),它是 SQL Server 的报表服务。如果你不使用报表的话可以将其停掉,不会影响数据库的其他工作。

      报表的应用属于 BI 中的基础应用,即标准报表。BI的应用分两种,一种是标准报表报表,一种是分析应用。

      要关闭它,需要到服务中将该服务设置启动类型为禁用(禁用是为了防止开机启动),并且将它停止。

    2. IIS 服务器,IIS 启用后,默认网站就占用了 80 端口。

通过以上方法应该就能解决端口占用的问题了。

解决 Windows 端口被占用的问题

https://ganzhixiong.com/p/d1a987cc/

Author

干志雄

Posted on

2023-03-07

Updated on

2023-03-07

Licensed under

Comments