【发布时间】:2015-05-19 14:00:17
【问题描述】:
我在 Mono 3.2.8 下运行的 C# .Net 4.5 中遇到了 Ping.Send 延迟问题。我的代码如下所示:
using(var sw = new StreamWriter("/ping.txt"))
{
var ping = new Ping();
PingReply reply;
sw.WriteLine("Pre ping: {0}", DateTime.Now);
// Ping local machine
reply = ping.Send("172.16.1.100", 60);
sw.WriteLine("Post ping: {0}", DateTime.Now);
if (reply != null && reply.Status == IPStatus.Success)
{
sw.WriteLine("Success! RTT: {0}", reply.RoundtripTime);
}
sw.WriteLine("Pre ping: {0}", DateTime.Now);
// Ping Google
reply = ping.Send("216.58.220.110", 60);
sw.WriteLine("Post ping: {0}", DateTime.Now);
if (reply != null && reply.Status == IPStatus.Success)
{
sw.WriteLine("Success! RTT: {0}", reply.RoundtripTime);
}
}
在 Linux 上的 Mono 下运行上述代码的输出是:
- 预ping:03/17/2015 15:43:21
- 发布 ping:03/17/2015 15:43:41
- 成功! RTT:2
- 预ping:03/17/2015 15:43:41
- 发布 ping:03/17/2015 15:44:01
- 成功! RTT:46
您可以看到,在“Pre”和“Post”时间戳之间,有 20 秒的延迟(这是一致的,始终是 20 秒)。运行 Mono 的机器在同一个 172.16.1.* 网络上,我将 Google ping 放在那里进行额外测试。
在我的 Windows 机器上本地运行相同的代码会产生以下输出(ping 没有延迟):
- 预 ping:2015 年 3 月 17 日下午 3:38:21
- 发布 ping:2015 年 3 月 17 日下午 3:38:21
- 成功! RTT:3
- 预 ping:2015 年 3 月 17 日下午 3:38:21
- 发布 ping:2015 年 3 月 17 日下午 3:38:21
- 成功! RTT:46
关于这里发生了什么的任何想法?我需要 ping 数百台机器,因此 ping 之间 20 秒的延迟是不可接受的。
更新:
我试过使用Ping.SendAsync 方法和下面的代码:
private void PingAsyncTest()
{
var ipAddresses = new List<String> { "172.16.1.100", "216.58.220.110" };
foreach (var ipAddress in ipAddresses)
{
using (var ping = new Ping())
{
ping.PingCompleted += PingCompleted;
ping.SendAsync(IPAddress.Parse(ipAddress), 1000);
}
}
}
private void PingCompleted(object sender, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
{
// Update successful ping in the DB.
}
}
我仍然看到SendAsync 呼叫和回复到达PingCompleted 之间的 20 秒延迟。这比应用程序在发送下一个 ping 之前等待 20 秒的原始代码要好一些。这样,所有 ping 都是异步发送和接收的,因此每次 ping 无需等待 20 秒。不过还是不太理想。
【问题讨论】:
-
可以肯定的是,从 Linux 机器执行简单的命令行 ping 具有足够的性能?你能启动像 Wireshark 这样的工具来查看网络级别发生了什么吗?