You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IP地址段内Ping部分IP触发Ping Exception问题咨询

Ping非有效IP时避免抛出异常的解决方案

问题背景

Ping网段10.1.1.1-10.1.1.10内的有效IP(如10.1.1.8)正常,但Ping非有效IP时触发PingException(内部包含Win32Exception错误码87:参数不正确),期望非有效IP场景不抛出异常,返回统一的不可达状态。

错误原因

系统网络栈在处理不存在的目标IP时,未返回常规的超时/不可达状态码,而是抛出了参数错误的Win32异常,被上层封装为PingException。

修复代码

protected async Task<PingReply?> DoPingAsync(IPAddress ipAddress, uint timeoutMilliSeconds)
{
    PingReply? pingReply = null;
         
    try
    {
        if (IsTraceEnabled)
            logger.LogTrace($"DoPingAsync() -> [{ipAddress}] Checking reachability.... ");

        using var ping = new Ping();

        pingReply = await ping
            .SendPingAsync(ipAddress, (int)timeoutMilliSeconds)
            .ConfigureAwait(false);

        if (IsTraceEnabled)
            logger.LogTrace($"DoPingAsync() -> [{ipAddress}] Ping status: {pingReply.Status}");
    }
    catch (PingException ex)
    {
        // 处理Win32参数错误的异常,手动构造不可达状态的PingReply
        if (ex.InnerException is Win32Exception win32Ex && win32Ex.ErrorCode == 87)
        {
            if (IsTraceEnabled)
                logger.LogTrace($"DoPingAsync() -> [{ipAddress}] Target IP unreachable (Win32 Error 87)");
            pingReply = PingReply.Create(ipAddress, (int)timeoutMilliSeconds, Array.Empty<byte>(), IPStatus.DestinationUnreachable);
        }
        else
        {
            logger.LogError(ex, "DoPingAsync -> Ping failed with unexpected error!");
        }
    }
    catch (Exception ex)
    {
        logger.LogError(ex, "DoPingAsync -> Unexpected error occurred!");
    }
   
    return pingReply;
}

核心改动说明

  • 精准捕获PingException,针对性处理错误码87的Win32异常,避免无差别记录错误日志
  • 手动创建PingReply对象,设置IPStatus.DestinationUnreachable状态,让上层逻辑可以统一处理有效/非有效IP的结果
  • 仅对非预期的Ping异常记录错误日志,减少日志噪音

内容的提问来源于stack exchange,提问作者user21917455

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:29