5

ローカル ネットワーク内のマシンへの接続を監視するために、この方法を繰り返し使用しています。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 秒に変更すると、ping の平均時間は 0.9 ミリ秒ですべて正常に通過します。

私が見つけた唯一の同様のものはこれです - http://support.microsoft.com/kb/2533627、これはあまり役に立ちません。

これが発生する理由と、高速接続を監視する方法を教えてください。

4

2 に答える 2

0

私は同じ問題を抱えていて、複数回試して修正しました。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;
    }
于 2014-01-23T18:07:25.887 に答える