我有以下 C# 代码:
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse("10.131.88.160");
int timeout =800;
Ping pinger = new Ping();
while (true)
{
PingReply reply = pinger.Send(ip, timeout, buffer);
Console.WriteLine(reply.Status);
Console.WriteLine(Convert.ToString(reply.RoundtripTime));
Thread.Sleep(1000);
}
其功能应与以下批次相同:
@echo off
cls
set ip=10.131.88.160
:schleife
ping %ip% -n 1 -w 800
timeout /t 1 /nobreak > nul
goto schleife
使用 C# 的 ping 测试每 3~4 次尝试就会失败,但使用批处理时每次尝试都会成功。
有人知道造成这种情况的原因是什么吗?
我尝试过其他IP地址,结果相同。 批处理文件总是有效,C# 有时会失败。
如果您深入挖掘 .net source 来找到
Ping
类,它会通过调用低级 IcmpSendEcho2 函数进行操作。据观察,将 timeout
设置为低于 1000
的值似乎不可靠。
你可以自己测试一下。在您的代码集中
timeout=999
,并查看间歇性故障。现在尝试使用 timeout=1000
,它们很可能会消失。
至于为什么
ping -w 800
中的cmd
效果更好,这是一个谜。但最好的猜测是它调用了不同的低级函数,或者它实际上并不尊重您给它的超时。我可以做到 ping -w 1
并且它仍然可以在 >200ms
ping 时间的机器上正常工作。