一、端口与网络通信
端口号用于在网络通信时标识通信端点,是一种抽象的概念。在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); } }
四、如何防止非法占用端口现象
为防止非法占用端口,我们可以在编写程序时考虑以下几个方面:
- 选择闲置端口,不建议使用系统常用端口;
- 确保不同程序之间不会占用同一端口;
- 关闭不必要的监听服务;
- 正确处理异常情况,释放占用的端口;
- 使用防火墙等安全工具进行保护。