您的位置:

Windows端口占用

一、端口与网络通信

端口号用于在网络通信时标识通信端点,是一种抽象的概念。在Windows中,共有65,535个端口号,其中从0至1023为系统保留端口,被系统或常用应用程序占用,一般要求管理员权限才能绑定。

使用网络通信的程序,需要将数据发送给特定的端口,接收方也是通过绑定监听端口被动接收数据,这些端口可能会被恶意程序滥用,导致占用端口的现象。

二、如何查看端口占用情况

在Windows操作系统中, Task Manager是最常规的查看端口占用情况的工具。可以进入‘进程’标签页,点击‘打开资源监视器’,在资源监视器的‘网络’标签页中查看网络连接情况,包括TCP和UDP连接,以及对应端口及占用程序。

//获取TCP端口占用情况示例代码
var tcpConnections = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections();
foreach (TcpConnectionInformation tcpInfo in tcpConnections) {
    Console.WriteLine("Local Address: {0}:{1}\tRemote Address: {2}:{3}\tState: {4}", 
          tcpInfo.LocalEndPoint.Address, tcpInfo.LocalEndPoint.Port, 
          tcpInfo.RemoteEndPoint.Address, tcpInfo.RemoteEndPoint.Port, tcpInfo.State);
}

//获取UDP端口占用情况示例代码
var udpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners();
foreach (IPEndPoint endPoint in udpListeners) {
    Console.WriteLine("Local Address: {0}:{1}", endPoint.Address, endPoint.Port);
}

三、如何释放端口占用

当端口被非正常占用时,会导致正常的网络通信受到阻碍,需要释放该端口的占用。常规的做法是关闭对应的程序或服务,但某些程序可能存在无法关闭的情况,这时可以使用一些工具进行强制终止占用端口的程序。

在Windows中,命令行工具netstat可以查询与TCP/IP连接相关的信息。使用netstat -a命令可以查询所有经过验证的TCP和UDP端口,包括监听状态和正在连接的端口。使用netstat -o命令可以查看占用端口的PID,根据PID可以重启、结束占用的进程。Windows 10以上版本可以使用'资源监视器'的网络标签页,右键要结束的进程名,选择‘终止进程’。

//释放当前已知端口号的占用示例代码
var processList = Process.GetProcesses();
foreach (Process process in processList) {
    try {
        var portList = IPGlobalProperties.GetIPGlobalProperties()
                .GetActiveTcpListeners().Select(p => p.Port)
                .Union(IPGlobalProperties.GetIPGlobalProperties()
                .GetActiveUdpListeners().Select(p => p.Port)).ToList();

        foreach (var port in portList) {
            var processName = process.ProcessName;
            var portUsed = process.GetNetStat(port, ProtocolType.Tcp).Concat(
                      process.GetNetStat(port, ProtocolType.Udp)).ToList();
            if (portUsed.Any()) {
                Console.WriteLine("Killing the process: {0}, which is listening on the port {1}", 
                      processName, port);
                process.Kill();
            }               
        }
    } catch (Exception ex) {
        Console.WriteLine(ex.Message);
    }
}

四、如何防止非法占用端口现象

为防止非法占用端口,我们可以在编写程序时考虑以下几个方面:

  • 选择闲置端口,不建议使用系统常用端口;
  • 确保不同程序之间不会占用同一端口;
  • 关闭不必要的监听服务;
  • 正确处理异常情况,释放占用的端口;
  • 使用防火墙等安全工具进行保护。