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
相关产品推荐
相关产品推荐

