首页 > 解决方案 > 如何仅 Ping IPv4?

问题描述

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

那么我如何仅 ping IPv4(如tracert 的 /4 开关)?

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

标签: c#.netpingipv4traceroute

解决方案


查看源代码(参考源GitHub),如果传递给的参数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...
}

推荐阅读