Как пинговать только для IPv4? - PullRequest
3 голосов
/ 01 апреля 2019

Я знаю IPv4-адрес моего маршрутизатора.Но когда я пинг с использованием TTL = 1, я не получаю этот IP.Скорее я получаю его IPv6-адрес.(Я знаю address.MapToIPv4(), но это только для IPv4, которые были заменены на IPv6.)

Так как мне пропинговать только для IPv4 (например, переключатель / 4 tracert )?

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

1 Ответ

3 голосов
/ 01 апреля 2019

Просмотр исходного кода ( Ссылочный источник , GitHub ), если параметр, переданный в Send(), является именем, тогда Dns.GetHostAddresses() используется для ее разрешения, и возвращается первый адрес, который используется.Таким образом, если этот первый адрес является IPv6-адресом, то этот адрес и будет проверен, и нет способа изменить это поведение.

Вместо этого вы можете сами вызвать Dns.GetHostAddresses(), filterрезультаты включают или предпочитают адреса 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...
}
...