核心實現
using System.Net.NetworkInformation;
public static bool PortInUse(int port) {
var ipProps = IPGlobalProperties.GetIPGlobalProperties();
var listeners = ipProps.GetActiveTcpListeners(); // 僅 TCP 監聽端口
foreach (var ep in listeners) {
if (ep.Port == port) return true;
}
return false;
}
完整測試示例
using System;
using System.Net;
using System.Net.Sockets;
class Program {
static void Main() {
// 啟動一個 HTTP 監聽器佔用 8080
var listener = new HttpListener();
listener.Prefixes.Add("https://*:8080/");
listener.Start();
Console.WriteLine("HttpListener started on 8080");
Console.WriteLine($"Port 8080 status: {(PortInUse(8080) ? "in use" : "free")}");
Console.ReadKey();
listener.Close();
}
static bool PortInUse(int port) {
var ipProps = IPGlobalProperties.GetIPGlobalProperties();
foreach (var ep in ipProps.GetActiveTcpListeners()) {
if (ep.Port == port) return true;
}
return false;
}
}
注意事項
GetActiveTcpListeners 僅返回 TCP 監聽端口,UDP 端口需用 GetActiveUdpListeners
- 需管理員權限才能看到所有進程的端口(否則僅見當前用戶進程)
- .NET Core / .NET 5+ 同樣適用
- 端口範圍:1024-65535(0-1023 為系統保留,需特權)
擴展:掃描可用端口範圍
public static int FindFreePort(int start = 10000, int end = 20000) {
var used = new HashSet();
var ipProps = IPGlobalProperties.GetIPGlobalProperties();
foreach (var ep in ipProps.GetActiveTcpListeners()) used.Add(ep.Port);
foreach (var ep in ipProps.GetActiveUdpListeners()) used.Add(ep.Port);
for (int p = start; p <= end; p++) {
if (!used.Contains(p)) return p;
}
throw new InvalidOperationException("無可用端口");
}