当前位置:首页 > 行业动态 > 正文

如何在C中检测端口是否被占用?

C#可通过TcpListener尝试绑定端口检测占用情况,示例使用try-catch块创建TcpListener实例,若端口被占用会抛出异常,通过捕获异常判断端口状态,适用于网络开发时快速验证端口可用性。

在开发网络应用或调试服务时,经常需要检查特定端口是否被占用,以下提供两种C#实现方法,并解释其原理和使用场景:

通过尝试绑定端口
(适合快速检测本地未被监听的端口)

using System.Net;
using System.Net.Sockets;
bool IsPortAvailable(int port)
{
    try
    {
        using var listener = new TcpListener(IPAddress.Loopback, port);
        listener.Start();
        listener.Stop();
        return true;
    }
    catch (SocketException ex) when (ex.SocketErrorCode == SocketError.AddressAlreadyInUse)
    {
        return false;
    }
}

特点

  • 直接尝试绑定端口获得准确结果
  • 仅检测本地TCP监听端口
  • 需要处理Socket异常
  • 执行耗时约10-50毫秒

查询系统网络信息
(适合获取被占用端口的详细信息)

using System.Net;
using System.Net.NetworkInformation;
(bool isUsed, string processInfo) CheckPortStatus(int port)
{
    var ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
    // 检测TCP监听端口
    var tcpListeners = ipGlobalProperties.GetActiveTcpListeners();
    if (tcpListeners.Any(endpoint => endpoint.Port == port))
        return (true, "TCP服务正在监听");
    // 检测已建立TCP连接
    var tcpConnections = ipGlobalProperties.GetActiveTcpConnections();
    if (tcpConnections.Any(conn => conn.LocalEndPoint.Port == port))
        return (true, "TCP连接已建立");
    return (false, "端口未被占用");
}

特点

  • 可获取端口占用类型(监听/连接)
  • 支持获取远程连接信息
  • 需要System.Net.NetworkInformation引用
  • 执行耗时约1-5毫秒

应用选择建议

  • 调试工具开发:优先方法二(响应更快)
  • 服务启动检查:推荐方法一(避免漏检)
  • 综合方案:先使用方法二快速检测,异常时用方法一确认

注意事项

  1. 需要管理员权限才能获取所有端口信息
  2. 某些端口可能被系统保留(如80/443)
  3. UDP端口检测需使用GetActiveUdpListeners
  4. 跨平台项目需注意.NET Core兼容性

错误处理优化

try
{
    var result = CheckPortStatus(8080);
    Console.WriteLine(result.isUsed ? $"端口被占用:{result.processInfo}" : "端口可用");
}
catch (NetworkInformationException ex)
{
    Console.WriteLine($"检测失败:{ex.Message}");
}

扩展应用场景

  • 自动化测试中预检测试环境
  • 服务部署时动态选择可用端口
  • 网络监控工具开发
  • 反面进程检测(结合进程ID查询)

引用说明:代码实现参考微软官方文档中关于TcpListener类、SocketException和IPGlobalProperties的技术规范,实际应用中建议结合具体需求添加日志记录和异常重试机制。

0