【发布时间】:2011-12-14 05:07:45
【问题描述】:
我有一个用 C# 编写的 .Net 2.0 应用程序,它监视本地 LAN 上的其他 Windows XP 计算机。在某些系统上,经过较长的正常运行时间(40 到 120 天)后,.Net Ping 可能会失败。 Windows 命令提示 ping 仍然成功。
一旦发生此故障,所有 .Net Ping 似乎都会失败。使用类似代码的单独 .Net 应用程序也会失败。
以下是代码示例:
internal static bool canPingHost(string host)
{
bool success = false;
const int PING_TIMEOUT_MS = 1000;
try
{
using (Ping p = new Ping())
{
PingReply pr = p.Send(host, PING_TIMEOUT_MS);
if (pr.Status == IPStatus.Success)
{
success = true;
}
}
}
catch
{
}
return success;
}
本期设置要点:
- 所有 PC 都插入同一个非托管交换机
- 所有其他 PC 都可以使用相同的 .Net Ping 与问题系统对话。
- Windows ping 在问题系统上正常工作。
- 在问题系统上尝试的任何 .Net 2.0 应用程序都会失败。
- 进出问题系统的数据库操作也可以正常工作(TCP 连接)
- 停止和启动应用程序并不能解决问题系统上的问题。
当这个系统出现故障时,我会运行另一个应用程序并提供更多调试信息。
static string doping(IPAddress IP)
{
int PING_TIMEOUT_MS = 3000;
string rv = IP.ToString();
using (Ping p = new Ping())
{
bool success = false;
PingReply pr = null;
try
{
pr = p.Send(IP, PING_TIMEOUT_MS);
success = pr.Status == IPStatus.Success;
}
catch (Exception ex)
{
rv = rv +" [ " +ex.Message + " ] ";
}
if (pr != null)
{
if (success)
{
rv = rv + " yes " + pr.RoundtripTime.ToString();
}
else
{
rv = rv + " no " + pr.Status.ToString();
}
}
else
{
rv = rv + " no (fail) ";
}
}
return rv;
}
程序的输出是192.168.0.2 no 1450。PingReply Status 变量返回 1450,它似乎没有在 IPStatus (PingReply.Status) 枚举中定义。
重新启动问题计算机后,.Net Ping 再次开始正常工作
看起来存在某种描述的资源问题。我不确定它可能是哪个资源。
我已阅读有关异步 Ping 和 .Net 2.0 的问题。这是一个同步 ping,据我所知,它不受影响。
我正在寻找:
- 首先预防问题
- 建议在远程系统出现故障后对其进行调试(生产系统、Windows XP SP3、未安装开发人员工具)
- 监控资源以确定哪个失败了。
注意事项:
- 目前无法定期重启有问题的系统。
- 目前不能选择升级到最新版本的 .Net Framework。
- 将软件更改为不再使用 .Net Ping 是一种选择,但我仍然想知道发生了什么。
【问题讨论】:
-
您可以从不只是捕获和吞下异常开始。很容易抛出一个异常,它非常清楚地解释了正在发生的事情 - 但你永远不会知道,因为你甚至没有记录就忽略了它。
-
1450 = Windows 错误代码中的 ERROR_NO_SYSTEM_RESOURCES - 不确定这是否会进入 PingReply.Status 枚举。
-
这听起来非常类似于 ol' Windows98 最长 48 天的正常运行时间问题。
-
@JonSkeet:失败后运行的附加应用程序确实捕获了异常。没有抛出异常,PingReply 变量正在正常返回。
-
@lnical:但是为什么不在正常流程中添加异常日志记录呢?为什么要丢失这些信息?
标签: c# .net windows-xp .net-2.0