Emin Kokalari Ответов: 1

Ping IP или проблема с именем хоста, всегда возвращает: TTL истек !


Проблема с пингом ip-адресов или имен хостов... Проблема в том,что всегда получают статус : TTL истекает даже тогда, когда хост недоступен, не существует или что-то другое ...

код такой :

PingReply Reply = await pingo.SendPingAsync(text_ip.Text, 4000, buffer, options);
            Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
            switch (Reply.Status)
            {
                case IPStatus.Success:

                    Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;

                case IPStatus.TimedOut:

                    Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;

                case IPStatus.TimeExceeded:

                    Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;

                case IPStatus.DestinationHostUnreachable:


                   Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;

                case IPStatus.DestinationNetworkUnreachable:

                    Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;

                case IPStatus.DestinationUnreachable:

                    Toast.MakeText(Activity, Reply.Status.ToString(), ToastLength.Long).Show();
                    break;
            }



Например, при добавлении ip-адреса, который не назначен ни одному устройству и не возвращается : конечный хост недоступен или что-то еще , но только ttl истек !

Что случилось ?

Что я уже пробовал:

Пробовал установить ttl на 64 прыжка , 128 и многие другие параметры, но это одно и то же. я пытаюсь пинговать модем, который подключен к беспроводной сети, адрес шлюза по умолчанию: 192.168.1.1 . Когда ping это все в порядке, но, например, если ping a ip, который не назначен где-то , например 192.168.1.123, он всегда возвращает ttl expired, когда он должен быть : Destination Host Unreachable . Спасибо, что уделили мне время . В opossite adb shell ping 192.168.1.123 возвращает : конечный хост недоступен

1 Ответов

Рейтинг:
8

Jochen Arndt

Вы пытаетесь пинговать систему в той же сети. Таким образом, нет никакого маршрутизатора, который мог бы вернуть Destination Host Unreachable Нет никакого другого устройства, реагирующего на Эхо-запрос, кроме адресованного, и если его нет, то произойдет тайм-аут.

При использовании оболочки ADB команда ping выполняется на вашем Android-устройстве, которое, вероятно, находится в другой подсети (WLAN). Затем включается маршрутизатор (переадресация пакетов из WLAN в LAN) и может сгенерировать недостижимое сообщение.

[РЕДАКТИРОВАТЬ]
Я упустил из виду, что проблема заключается в том, что TTL expired возвращается вместо тайм-аута.

При использовании Mono использованные источники можно найти по адресу моно/пинг.КС мастер · моно/Моно · на GitHub[^].
Это вызывает систему свист команда и проверка кода выхода:

if (!ping.WaitForExit (timeout) || (ping.HasExited && ping.ExitCode == 2))
    status = IPStatus.TimedOut;
else if (ping.ExitCode == 0)
    status = IPStatus.Success;
else if (ping.ExitCode == 1)
    status = IPStatus.TtlExpired;

Таким образом, TTL expired устанавливается, когда не было тайм-аута, ошибки или успеха (код выхода 2 или 0), а код выхода был 1.
Видеть ping(8) - man-страница Linux[^] для случаев возвращения 1:
Цитата:
Если ping вообще не получает никаких ответных пакетов, он выйдет с кодом 1. Если заданы количество пакетов и крайний срок, и к моменту наступления крайнего срока получено меньше количества пакетов, то он также завершится с кодом 1. При другой ошибке он выходит с кодом 2. В противном случае он выходит с кодом 0. Это позволяет использовать код выхода, чтобы увидеть, жив ли хост или нет.

Таким образом, возвращаемое значение 1 указывает на то, что ответ не был получен (по разным причинам), и реализация Mono устанавливает в этом случае статус TTL expired. Я ожидал бы, что в таких случаях будет возвращен статус тайм-аута. Но кажется, что обнаружение таймаута реализации Mono здесь не срабатывает (например, потому, что свист команда выходит на свой собственный тайм-аут раньше).

Таким образом, есть два возможных решения:

  1. Относиться значение TTL истек, а хозяина нет в живых (но это потом будет игнорировать игнорировать реальное значение TTL истек обнаружений)
  2. Проверьте Моноисточники, чтобы увидеть, можно ли понизить внутреннее значение таймаута (или значение, переданное в свист команда может быть улучшена) и отправить отчет об ошибке

[/РЕДАКТИРОВАТЬ]


Emin Kokalari

Хорошо, хорошо ... но проблема не в том, что конечный хост недоступен ... Я просто сказал это как exaple, на самом деле каждый запрос ping, который я сделал, возвращает Ttl с истекшим сроком действия, если он не удался, даже если он должен быть тайм-аут, или недоступен , или не может быть разрешен , или что-то еще

Jochen Arndt

ОК. Теперь я понимаю. У вас истек срок действия TTL, но он должен быть тайм-аут (или пункт назначения недоступен).

Когда нет задействованных маршрутизаторов, вы не должны получать TTL с истекшим сроком действия. Возможные причины могут быть нулевым TTL (вы установили разные значения) или у вас есть маршрутизаторы, участвующие в создании кругового маршрута (где-то неправильная конфигурация маршрутизации; вероятно, в системе, выполняющей ваш код).

Где вы выполняете свой код (ПК или Android-устройство)?

Чтобы проверить это с помощью Windows откройте командный терминал и введите
tracert 192.168.1.123
Это должно показать круговые петли.

Если он находится на Android-устройстве, то это может быть также ошибка в Mono.
Видишь https://github.com/mono/mono/blob/master/mcs/class/System/System.Net.NetworkInformation/Ping.cs

Быстрый взгляд показывает, что TTL expired возвращается, когда код выхода равен 1 (строка 339). Возможно, это и есть причина. Я добавлю это к своему ответу.

Emin Kokalari

Я не видел этой строки точно в классе ping в mono project. Во всяком случае , спасибо, это именно то, что я искал . Еще раз спасибо !