“ping.send()”有时会失败,而 cmd 中的“ping”始终有效

问题描述 投票:0回答:1

我有以下 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# 有时会失败。

c# network-programming ping
1个回答
0
投票

如果您深入挖掘 .net source 来找到

Ping
类,它会通过调用低级 IcmpSendEcho2 函数进行操作。据观察,将
timeout
设置为低于
1000
的值似乎不可靠

你可以自己测试一下。在您的代码集中

timeout=999
,并查看间歇性故障。现在尝试使用
timeout=1000
,它们很可能会消失。

至于为什么

ping -w 800
中的
cmd
效果更好,这是一个谜。但最好的猜测是它调用了不同的低级函数,或者它实际上并不尊重您给它的超时。我可以做到
ping -w 1
并且它仍然可以在
>200ms
ping 时间的机器上正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.