Ping z Windows 7 nie otrzymuje odpowiedzi, ale ustawia poziom błędu na 0

10

Z komputera z systemem Windows 7 pinguję adres IP wyłączonej maszyny.

C:\>ping 192.168.1.222
Pinging 192.168.1.222 with 32 bytes of data:
Reply from 192.168.1.222: Destination host unreachable.
Reply from 192.168.1.222: Destination host unreachable. 
Reply from 192.168.1.222: Destination host unreachable.

Ping statistics for 192.168.1.222:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss)

Nawet jeśli nie ma odpowiedzi, poziom błędu jest ustawiony na 0.

Co próbuję zrobić, to dowiedzieć się, czy zdalny komputer odpowiada na ping. Jednym z moich testów jest wyłączenie maszyny i pingowanie jej. Z jakiegoś powodu ping ustawia poziom błędu na 0.

Doron
źródło

Odpowiedzi:

7

Dzieje się tak, ponieważ miejsce docelowe znajduje się w lokalnej podsieci. Jeśli miejsce docelowe znajduje się poza podsiecią lokalną, oczekiwane Request timed out. jest widziany. Jednak nawet nieistniejące miejsca docelowe w lokalnej podsieci będą zgłaszane Reply from x.x.x.x: Destination host unreachable.. Tak jak ten słup z hydromasażem wyjaśnia to, wszystko zależy od tego, czy jego pierwszy skok przekroczył limit czasu - a pingowanie lokalnej podsieci to tylko jeden skok. Najwyraźniej to z założenia że poziom błędu jest ustawiony na 0 gdy każdy odpowiedź została odebrana, a host unreachable liczy się jako odpowiedź.


Obejścia

Rozbiór gramatyczny zdania ping wyjście z findstr

Źródło: http://forums.techguy.org/7318331-post3.html

Następujące polecenie pinguje go raz ( ping -n 1 ). The %1 jest pierwszym parametrem przekazanym do pliku wsadowego. Zmienna attrib jest ustawiana w zależności od tego, czy miejsce docelowe odpowiada, czy nie.

echo Scanning %1
set attrib=responding
ping -n 1 %1|Findstr /I /C:"timed out" /C:"host unreachable" /C:"could not find host"
if %errorlevel%==0 set attrib=nonresponsive

Oddzielne narzędzie

Jest to interesujące narzędzie żywy . Nie wypróbowałem go i został wydany w 2002 roku, więc może nie działać nawet w systemie Windows 7. Jeśli jednak zadziała, ustawi poziom błędu na 2, gdy host docelowy jest nieosiągalny. Nie poleciłbym tego jednak.

Bob
źródło
+1 dla alive, używane także wiele lat temu, z tego właśnie powodu.
Bryan
Jeśli odpowiedź brzmi „Żądanie ping nie może znaleźć hosta madeup04. Sprawdź nazwę i spróbuj ponownie” to nie działa, ponieważ szuka „hosta nieosiągalnego”, więc twoim wynikiem jest „madeup04 odpowiada”, co jest błędne.
James Jenkins
1
@JamesJenkins Założyłem, że podobnie jak w pytaniu, próba pingowania jest przeciwko adresowi IP. Nawet wtedy jest to banalna zmiana (dodaj kolejną /C szukana fraza). Prawie nie warto mieć downvote. W tej chwili poprawiłem odpowiedź, więc dziękuję za wskazanie tego.
Bob
Ugh ... cóż, to głupie ... Spędziłem pół dnia, próbując dowiedzieć się, dlaczego mój system zgłaszał podsystem jako online - podczas gdy najwyraźniej nie ...
Matt Clark
7

Stałem także przed problemem i rozwiązałem go kluczem ” -w 2000 „ Ping uzupełniony kluczem ” -w „i liczba milisekund powraca 1 gdy host w lokalnej podsieci jest nieosiągalny. AFAIK, liczba milisekund musi być mniejsza niż limit czasu po tym, jak podsystem sieciowy Windows zwróci „Host docelowy nieosiągalny”.

Na moim komputerze (Windows 7):
C: & gt; ping -w 3000 192.168.10.22

Pingowanie 192.168.10.22 z 32 bajtami danych:
Odpowiedź od 192.168.10.2: Host docelowy nieosiągalny.
Odpowiedź od 192.168.10.2: Host docelowy nieosiągalny.
Odpowiedź od 192.168.10.2: Host docelowy nieosiągalny.
Odpowiedź od 192.168.10.2: Host docelowy nieosiągalny.

Statystyki pingowania dla 192.168.10.22:
Pakiety: Wysłane = 4, Otrzymane = 4, Utracone = 0 ( 0% straty ),

C: & gt; echo% errorlevel%
0

ale

C: & gt; ping -w 2999 192.168.10.22

Pingowanie 192.168.10.22 z 32 bajtami danych:
Upłynął limit czasu żądania.
Upłynął limit czasu żądania.
Upłynął limit czasu żądania.
Upłynął limit czasu żądania.

Statystyki pingowania dla 192.168.10.22:
Pakiety: Wysłane = 4, Otrzymane = 0, Utracone = 4 ( 100% straty ),

C: & gt; echo% errorlevel%
1

user354000
źródło
Czy każdy może potwierdzić, że dotyczy to wszystkich przypadków użycia?
user1853181
2
Testowałem ustawienie -w przełączyć na 2999 przeciwko poprawnemu i nieprawidłowemu adresowi IP, dodając -n 1 przełącznik. Wydaje się działać.
fyrye
tak ... to ustawia poziom błędu, jeśli nie ma hosta pod określonym adresem ... dzięki
ZEE
2

To działa dla mnie na Windows 7:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f %%i in (PCS.TXT) do (
   SET bHOSTUP=0
   ping -n 2 %%i |find "TTL=" && SET bHOSTUP=1
   IF !bHOSTUP! equ 1 (
      CALL :HOSTUP %%i
   ) else (
      CALL :HOSTDOWN %%i 
   )
)

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B
Andrew S
źródło