.Net 中的 Ping.Send(ip, timeout) 返回太快并抱怨超时

我反复使用这种方法来监视与本地网络中机器的连接。从 cmd 进行相同的测试时,结果稳定且一致:

C:Windowssystem32>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 秒 - 全部成功通过,平均 ping 时间为 0.9 毫秒。

我发现的唯一类似的东西是这个 - http://support.microsoft.com/kb/2533627 ,它没有多大帮助。

为什么会发生这种情况以及如何监控高速连接?

stack overflow Ping.Send(ip, timeout) in .Net returns too fast and complains on timeout
原文答案

答案:

作者头像

我遇到了同样的问题并多次尝试修复它。并且不知道 Thread.Sleep(50);是必要的,但它似乎有帮助。

Buffer、TimeOut、TTL 只是蛇油 ;)

    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;
    }
作者头像

以防万一有人仍然有这个问题:由于某种原因,Thread.Sleep(50) 确实解决了这个问题。