我有以下 C# 代码用于 ping IP,并将结果写入日志。
private async ValueTask PingMachine() {
var timesToPing = 4;
var counter = 1;
while (counter <= timesToPing) {
var reply = await Pinger();
foreach (var r in reply) {
TagService.log_PLC.AppendLine($" Pinged {TagService.IP_PLC_List} {counter} times time:{r.RoundtripTime} status: {r.Status.ToString()}");
}
}
counter++;
}
private async Task<IEnumerable<PingReply>> Pinger() {
List<string> addresses = new List<string>();
if (Check_IP_Correct(TagService.IP_PLC_List) == true) {
addresses.Add(TagService.IP_PLC_List);
}
var tasks = addresses.Select(async ip => await new Ping().SendPingAsync(ip, 1000));
var reply = await Task.WhenAll(tasks);
return reply;
}
当我 ping 一个正常在线的 IP 时,没有问题,但是当我 ping 一个无法访问的特定 IP 进行测试时,日志中总是出现以下情况。 (3次
TimedOut
,第四次回复始终是DestinationHostUnreachable
Pinged 10.92.XXX.XX 1 times time:0 status: TimedOut
Pinged 10.92.XXX.XX 2 times time:0 status: TimedOut
Pinged 10.92.XXX.XX 3 times time:0 status: TimedOut
Pinged 10.92.XXX.XX 4 times time:0 status: DestinationHostUnreachable
当我在具有相同 IP 的同一服务器中进行测试时,但这次直接在命令行中,我总是得到类似
Destination host unreachable
的回复。
Reply from 100.72.XXX.XX: Destination host unreachable.
Reply from 100.72.XXX.XX: Destination host unreachable.
Reply from 100.72.XXX.XX: Destination host unreachable.
Reply from 100.72.XXX.XX: Destination host unreachable.
我认为命令行中的回复应该是正确的。为什么我的代码得到不同的回复?可能出了什么问题?
据我所知,TCP/IP 中没有规范说明当 ping 在超时之前没有得到响应时必须告诉用户什么。
因此每个客户端只是尝试向用户提供适当且有用的消息。
看起来 ping.exe 命令行工具的创建者选择说“来自 100.72.XXX.XX 的回复:目标主机无法访问。”
无论您用于从 C# ping 的库的创建者都选择了“Pinged 10.92.XXX.XX 3 次 time:0 status: TimedOut”
它们不同对你来说重要吗?