我正在重复使用此方法,以监控本地网络中与计算机的连接。当从cmd完成相同的测试时,结果是稳定且一致的:
C:\Windows\system32>ping -t 192.168.11.12
Pinging 192.168.11.12 with 32 bytes of data:
Reply from 192.168.11.12: bytes=32 time=1ms TTL=126
Reply from 192.168.11.12: bytes=32 time=1ms TTL=126
但是当从C#运行500毫秒超时时,它甚至会在超时到期之前失败:
public void TestIpAnswersPing()
{
var ip = "192.168.11.12";
var timeout = TimeSpan.FromMilliseconds(500);
var p = new Ping();
foreach (var i in Enumerable.Range(0, 1000))
{
var start = DateTime.Now;
PingReply reply = p.Send(ip, (int)timeout.TotalMilliseconds);
if(reply.Status != IPStatus.Success)
{
Debug.Assert(DateTime.Now - start >= timeout);
}
}
}
如果我将超时更改为1秒 - 所有通过成功的平均时间为0.9毫秒。
我发现的唯一类似的事情就是这个 - http://support.microsoft.com/kb/2533627,这无济于事。
为什么会出现这种情况以及如何监控高速连接?
答案 0 :(得分:0)
我遇到了同样的问题并通过多次尝试修复了它。 并且不知道Thread.Sleep(50);是必要的,但它似乎有所帮助。
Buffer,TimeOut,TTL只是snakeoil;)
private PingReply Ping(string ip, int tryCount = 0)
{
var ping = new Ping();
byte[] buffer = new byte[65500];
var pingReply = ping.Send(ip, 500, buffer, new PingOptions(600, false));
if (pingReply.Status == IPStatus.Success)
{
return pingReply;
}
if (tryCount < 5)
{
Thread.Sleep(50);
return Ping(ip, tryCount + 1);
}
return pingReply;
}
答案 1 :(得分:0)
以防万一有人仍然有这个问题:由于某种原因,Thread.Sleep(50) 确实解决了这个问题。