如何仅对IPv4进行Ping操作?

时间:2019-04-01 19:02:27

标签: c# .net ping ipv4 traceroute

我知道路由器的IPv4地址。但是,当我使用TTL = 1 Ping时,我没有得到该IP。相反,我得到了它的IPv6地址。 (我知道address.MapToIPv4(),但这仅适用于已更改为IPv6的IPv4。)

那我如何仅对IPv4进行ping操作(如tracert's /4 switch)?

var reply = new Ping().Send("example.com", 10000, new byte[] { 1 }, new PingOptions(1, true));

1 个答案:

答案 0 :(得分:3)

查看源代码(Reference SourceGitHub),如果传递给Send()的参数是一个名称,则使用Dns.GetHostAddresses()来解析它和第一个地址返回的是使用的。因此,如果第一个地址是IPv6地址,则该地址将被ping通,并且无法更改该行为。

相反,您可以自己调用Dns.GetHostAddresses(),过滤结果以包含或首选IPv4地址,然后将那个传递给Ping.Send()

IPAddress addressToPing = Dns.GetHostAddresses("example.com")
    .First(address => address.AddressFamily == AddressFamily.InterNetwork);

using (Ping ping = new Ping())
{
    PingReply reply = ping.Send(addressToPing, 10000, new byte[] { 1 }, new PingOptions(1, true));

    // Do something with reply...
}